Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1233
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Charg:
На 20 текстбоксах вручную убирать? »
Ну, не в каждом по отдельности, но вручную...
Сгруппировать-то можно (например, в стекпанель), но не всеми свойствами в дочерних объектах можно манипулировать через родителя... т.е. размеры, например, вряд ли получится присваивать полям.
По шаблону - не знаю, возможно, что-то и существует, но не попадалось на глаза и не пользовался...
Скорее, можно осуществить желаемое, если выделить несколько элементов, а потом на панели свойств уже осуществлять очистку или изменение каких-либо свойств.

Цитата Charg:
То же касается ивентов - каждый раз когда вводится что-то в колонку "количество" - сумма по этой банкноте и общая - должны пересчитываться, снова таки на каждый из 10 текстбоксов надо вручную дописать ивент. »
Ну, тут всё просто...
Группируем текстбоксы (в которых осуществляется ввод) в ту же StackPanel, присваиваем ей имя, например, Stack1.
Далее, меняем код создания переменных на такой:
Код: Выделить весь код
$xaml.selectnodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | %{
	set-variable -name "WPF$($_.name)" -value $form.findname($_.name) -scope global
}
а также, можно добавить функцию, для просмотра созданных переменных:
Код: Выделить весь код
function get-formvariables{
	write-host "found the following interactable elements from our form" -for cyan
	get-variable wpf*
}
get-formvariables
- здесь в обоих функциях, для создаваемых переменных, используется префикс WPF, для простоты получения списка созданных переменных. Т.е. в коде необходимо поменять имена переменных для формы.
Затем, можем запустить форму (. .\script.ps1) и посмотреть, что переменная $WPFStack1 существует.
Далее смотрим доступные методы:
Код: Выделить весь код
$WPFStack1|gm add* -m method -force
и видим, что существует, например такой: add_KeyUp
Создаем обработчик ивента:
Код: Выделить весь код
$WPFStack1.add_KeyUp({
	fButtonClick
})
и вуаля, получаем то, что требовалось с помощью одного обработчика.
Здесь полный код со всеми корректировками:
script.ps1
Код: Выделить весь код
<#
To be able to export GUI made in Visual Studio into Powershell:

Change first XAML row
From: <Window x:Class="WPF_Inkass.MainWindow"
To: <Window

TODO: format automatically
#>


<########################
#### FUNCTIONS START ####
#########################>


function fValidate {
	# todo
}

function fCalculateSumms {
	# Bills
	$wpfBills1UAH_ResultTextbox.Text = (1 * $($wpfBills1UAH_NumberTextbox.Text))
	$wpfBills2UAH_ResultTextbox.Text = (2 * $($wpfBills2UAH_NumberTextbox.Text))
	$wpfBills5UAH_ResultTextbox.Text = (5 * $($wpfBills5UAH_NumberTextbox.Text))
	$wpfBills10UAH_ResultTextbox.Text = (10 * $($wpfBills10UAH_NumberTextbox.Text))
	$wpfBills20UAH_ResultTextbox.Text = (20 * $($wpfBills20UAH_NumberTextbox.Text))
	$wpfBills50UAH_ResultTextbox.Text = (50 * $($wpfBills50UAH_NumberTextbox.Text))
	$wpfBills100UAH_ResultTextbox.Text = (100 * $($wpfBills100UAH_NumberTextbox.Text))
	$wpfBills200UAH_ResultTextbox.Text = (200 * $($wpfBills200UAH_NumberTextbox.Text))
	$wpfBills500UAH_ResultTextbox.Text = (500 * $($wpfBills500UAH_NumberTextbox.Text))
	$wpfBills1000UAH_ResultTextbox.Text = (1000 * $($wpfBills1000UAH_NumberTextbox.Text))

	# Overall Result
	$overall = $(
		[decimal]$($wpfBills1UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills2UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills5UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills10UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills20UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills50UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills100UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills200UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills500UAH_ResultTextbox.Text) +
		[decimal]$($wpfBills1000UAH_ResultTextbox.Text)
	)
	$wpfResultLabel.Content = "Итоговая сумма:"
	$wpfResultTextbox.Text = "$overall грн."
	$wpfResultTextbox.Background = "LightGreen"
}

function fButtonClick {
	fCalculateSumms
}

<########################
##### FUNCTIONS END #####
#########################
#### XAML GUI START #####
#########################>

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Инкассация" Height="400" Width="500" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid ForceCursor="True" Width="auto">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" MinWidth="180"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid x:Name="GridBills" Height="auto" Width="auto" Grid.Column="0" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"></ColumnDefinition>
                <ColumnDefinition Width="auto"></ColumnDefinition>
                <ColumnDefinition Width="auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Content="Номинал" HorizontalContentAlignment="Center" Grid.Column="0" Background="AntiqueWhite"/>
            <Label Content="Количество" HorizontalContentAlignment="Center" Grid.Column="1" Background="AntiqueWhite" BorderBrush="Transparent"/>
            <Label Content="Итого" HorizontalContentAlignment="Center" Grid.Column="2" Background="AntiqueWhite"/>
            <Label Content="1 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="1"/>
            <Label Content="2 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="2"/>
            <Label Content="5 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="3"/>
            <Label Content="10 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="4"/>
            <Label Content="20 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="5"/>
            <Label Content="50 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="6"/>
            <Label Content="100 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="7"/>
            <Label Content="200 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="8"/>
            <Label Content="500 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="9"/>
            <Label Content="1000 грн" Width="auto" Height="auto" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0" Grid.Row="10"/>
            <StackPanel x:Name="Stack1" Grid.Column="1" Orientation="Vertical" Grid.Row="1" Grid.RowSpan="10">
                <TextBox x:Name="Bills1UAH_NumberTextbox" TabIndex="1" IsTabStop="True" BorderBrush="IndianRed" Width="auto" Height="34" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills2UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="35" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills5UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="34" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills10UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="35" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills20UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="34" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills50UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="35" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills100UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="34" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills200UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="35" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills500UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="34" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                <TextBox x:Name="Bills1000UAH_NumberTextbox" BorderBrush="IndianRed" Width="auto" Height="35" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
            </StackPanel>
            <TextBox Name="Bills1UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="1" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills2UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="2" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills5UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="3" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills10UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="4" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills20UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="5" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills50UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="6" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills100UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="7" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills200UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="8" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills500UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="9" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
            <TextBox Name="Bills1000UAH_ResultTextbox" IsTabStop="False" Text="0" Grid.Column="2" Grid.Row="10" Width="auto" Height="auto" Margin="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly ="True" BorderBrush="Transparent"/>
        </Grid>
        <Grid x:Name="GridAdditionals" Height="auto" Width="auto" Grid.Column="1" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition x:Name="Title0" Height="auto"/>
                <RowDefinition x:Name="Date1" MinHeight="40" Height="auto"/>
                <RowDefinition x:Name="Bag2" MinHeight="30" Height="auto"/>
                <RowDefinition x:Name="Sender3" MinHeight="30" Height="auto"/>
                <RowDefinition x:Name="Recipient4" MinHeight="30" Height="auto"/>
                <RowDefinition x:Name="ResultSum5"/>
                <RowDefinition x:Name="Button6"/>
                <RowDefinition x:Name="Notes7" Height="auto"/>
            </Grid.RowDefinitions>
            <Label HorizontalContentAlignment="Center" Content="Доп. информация" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Background="AntiqueWhite"/>

            <Label x:Name="InkassDateLabel" HorizontalContentAlignment="Right" Content="Дата инкассации" VerticalAlignment="Center" Grid.Row="1" Grid.Column="0"/>
            <DatePicker Name="InkassDate" IsTodayHighlighted="True" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="1"/>

            <Label x:Name="BagNumberLabel" HorizontalContentAlignment="Right" Content="Сумка №" VerticalAlignment="Center" Grid.Row="2" Grid.Column="0"/>
            <TextBox BorderBrush="IndianRed" Name="BagNumberTextbox" VerticalContentAlignment="Center" Grid.Row="2" Grid.Column="1"/>

            <Label x:Name="SenderLabel" HorizontalContentAlignment="Right" Content="Отправитель:" VerticalAlignment="Center" Grid.Row="3" Grid.Column="0"/>
            <TextBox BorderBrush="IndianRed" Name="SenderTextbox" Text="ФОП " VerticalContentAlignment="Center" Grid.Row="3" Grid.Column="1"/>

            <Label x:Name="RecipientLabel" HorizontalContentAlignment="Right" Content="Получатель:" VerticalAlignment="Center" Grid.Row="4" Grid.Column="0"/>
            <TextBox BorderBrush="IndianRed" Name="RecipientTextbox" Text="ФОП " VerticalContentAlignment="Center" Grid.Row="4" Grid.Column="1"/>

            <Label Name="ResultLabel" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" Grid.Row="5" Grid.Column="0"/>
            <TextBox Name="ResultTextbox" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="5" Grid.Column="1" IsTabStop="False" BorderBrush="Transparent" IsReadOnly="True" IsHitTestVisible="False"/>

            <Button IsTabStop="False" IsEnabled="True" Name="FinalButton" Content="Сначала заполни всё красное" Grid.ColumnSpan="2" Grid.Row="6" Width="auto" Height="auto" BorderBrush="Black"/>
        </Grid>
    </Grid>
</Window>
"@

<########################
##### XAML GUI END ######
#########################>

# Read XAML
$reader = (New-Object System.Xml.XmlNodeReader $XAML) 
try{
	$Form=[Windows.Markup.XamlReader]::Load( $reader )
}
catch{
	Write-Warning $_.Exception
	throw
}

# Store Form Objects In PowerShell
#$allnewelements = @()
#$xaml.SelectNodes("//*[@Name]") | ForEach-Object {Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name); $allnewelements += $_}

$xaml.selectnodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | %{
	set-variable -name "WPF$($_.name)" -value $form.findname($_.name) -scope global
}

function get-formvariables{
	write-host "found the following interactable elements from our form" -for cyan
	get-variable wpf*
}
get-formvariables

# Make DatePicker select today's date by default
$wpfInkassDate.SelectedDate = [datetime]::Now

$button = $Form.FindName("FinalButton")
$button.Add_Click({
	fButtonClick 
})

$WPFStack1.add_KeyUp({
	fButtonClick
})

# Show Form SHOULD BE LAST ROW
$Form.ShowDialog() | Out-Null

# Get date with ukrainian month name in genitive case
if ($null -ne $($wpfInkassDate.Text)) {
	[int]$MonthNumber = $wpfInkassDate.Text | Get-Date -Format "MM"
	$MonthName = ([cultureinfo]::CreateSpecificCulture("uk-UA")).DateTimeFormat.MonthGenitiveNames[$($MonthNumber - 1)]
	$UkrainianDateText = $wpfInkassDate.Text | Get-Date -Format "dd $($MonthName) yyyy"
} else {
	$wpfInkassDate.SelectedDate = [datetime]::Now
}

Функцию пересчета использовал уже существующую, которая запускалась по кнопке. Но, в принципе, для отдельного пересчета, без вывода общих итогов, можно написать и отдельную функцию.
- в общем, варианты есть, чтобы упростить себе жизнь

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:13, 18-09-2019 | #11