WPF и Powershell: зеркальное отображение / синхронизация текстовых полей - PullRequest
0 голосов
/ 03 ноября 2018

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

<TextBox x:Name="TextBoxUserLogonNameUPN" HorizontalAlignment="Left" Height="23" Margin="10,41,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="300"/>
<TextBox x:Name="TextBoxUserLogonNameSamAccountName" HorizontalAlignment="Left" Height="23" Margin="326,100,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="310" Text="{Binding Path=Text, ElementName=TextBoxUserLogonNameUPN, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>

Я пробовал выше, но с Mode = OneWay в Binding. Если я обновляю первое текстовое поле второй раз, после обновления второго вручную оно стирает то, что было во втором, и снова отражает.

Я использую WPF с PowerShell. Я с удовольствием справлюсь с этим с помощью Powershell, если это не удастся сделать в Xaml.

1 Ответ

0 голосов
/ 03 ноября 2018

Предполагая, что textbox1 убыток focus - это событие, которое должно скопировать текст textbox1 в textbox2, этот код должен работать для вас. Все действие находится в функции textBox1_LostFocus. В первый раз просто установите для свойства textbox2Tag значение, которое вы проверяете второй и последующие разы с помощью

Примечание. Форма имеет две метки и два текстовых поля

WpfWindow1.xaml.ps1 является точкой входа для этой программы

WpfWindow1.xaml.ps1

function Add-ControlVariables {

New-Variable -Name 'textBox1' -Value $window.FindName('textBox1') -Scope 1 -Force   
New-Variable -Name 'textBox2' -Value $window.FindName('textBox2') -Scope 1 -Force
}

function Load-Xaml {
    [xml]$xaml = Get-Content -Path $PSScriptRoot\WpfWindow1.xaml
    $manager = New-Object System.Xml.XmlNamespaceManager -ArgumentList $xaml.NameTable
    $manager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
    $xaml.SelectNodes("//*[@x:Name='textBox1']", $manager)[0].RemoveAttribute('TextChanged')
    $xaml.SelectNodes("//*[@x:Name='textBox2']", $manager)[0].RemoveAttribute('TextChanged')
    $xaml.SelectNodes("//*[@x:Name='textBox1']", $manager)[0].RemoveAttribute('LostFocus')
    $xamlReader = New-Object System.Xml.XmlNodeReader $xaml
    [Windows.Markup.XamlReader]::Load($xamlReader)
}

function Set-EventHandlers {

    $textBox1.add_TextChanged({
        param([System.Object]$sender,[System.Windows.Controls.TextChangedEventArgs]$e)
        textBox1_TextChanged($sender,$e)
    })
    $textBox2.add_TextChanged({
        param([System.Object]$sender,[System.Windows.Controls.TextChangedEventArgs]$e)
        textBox2_TextChanged($sender,$e)
    })
    $textBox1.add_LostFocus({
        param([System.Object]$sender,[System.Windows.RoutedEventArgs]$e)
        textBox1_LostFocus($sender,$e)
    })
}

$window = Load-Xaml
Add-ControlVariables
Set-EventHandlers

function textBox1_TextChanged
{
    param($sender, $e)
    #do stuff you want to do when textBox1.Text changes
}

function textBox2_TextChanged
{
    param($sender, $e)

    #do stuff you want to do when textBox2.Text changes
}

function textBox1_LostFocus
{
    param($sender, $e)

    if ($textBox2.Tag -ne "mirrored")
    {
        #turn off textBox2 TextChanged event so that code in textBox2_TextChanged is not executed
        $textBox2.remove_TextChanged({
            param([System.Object]$sender,[System.Windows.Controls.TextChangedEventArgs]$e)
            textBox2_TextChanged($sender,$e)
        })

        $textBox2.Text = $sender.Text
        $textBox2.Tag = "mirrored"

        #turn textBox2 TextChanged event back on
        $textBox2.add_TextChanged({
            param([System.Object]$sender,[System.Windows.Controls.TextChangedEventArgs]$e)
            textBox2_TextChanged($sender,$e)
        })
    }
}


$window.ShowDialog()

WpfWindow1.xaml

<Window

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  Title="MainWindow" Height="350" Width="525">

    <Grid>
        <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="29" Margin="79,45,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="132" TextChanged="textBox1_TextChanged" LostFocus="textBox1_LostFocus"/>
        <TextBox x:Name="textBox2" HorizontalAlignment="Left" Height="29" Margin="298,45,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="105" TextChanged="textBox2_TextChanged"/>
        <Label Content="Text1:" HorizontalAlignment="Left" Height="25" Margin="32,45,0,0" VerticalAlignment="Top" Width="63"/>
        <Label Content="Text2:" HorizontalAlignment="Left" Height="25" Margin="242,45,0,0" VerticalAlignment="Top" Width="56"/>

    </Grid>

</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...