简体   繁体   English

将数据从一个 window 发送到另一个 c# xaml wpf

[英]send data from one window to another c# xaml wpf

i want to send Data from one Textbox on window One to a label on window Two.我想将数据从 window 一上的一个文本框发送到 window 二上的 label。

starting with window two:从 window 两个开始:

<StackPanel>
    <StackPanel x:Name="ButtonStackPanel" Height="Auto" Width="Auto">
        <StackPanel Orientation="Horizontal">
            <StackPanel Orientation="Vertical">
                <Button Style="{DynamicResource ButtonStyle}" Content="To The Dark Side" Click="OnClickToDarkSide"/>
                <Button Style="{DynamicResource ButtonStyle}" Content="To The Gray" Click="OnClickToGraySide"/>
                <Button Style="{DynamicResource ButtonStyle}" Content="To The Light Side" Click="OnClickToLightSide"/>
            </StackPanel>
            <Border HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Red" Height="Auto" Width="2"/>
            <Label Style="{DynamicResource LabelStyle}" x:Name="theTextBlock" Content="{Binding Source=CodeText}"/>
            <Border HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Red" Height="Auto" Width="2"/>
            <ToggleButton Style="{DynamicResource ToggleButtonStyle}" Content="Open Style Window" Name="StyleWindowButton" Click="OnClickOpenStyleWindow"/>
            <ToggleButton Style="{DynamicResource ToggleButtonStyle}" Content="Open Text Window" Name="TextWindowButton" Click="OnClickOpenTextWindow"/>
        </StackPanel>
        <Border Height="2" Width="Auto" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
    </StackPanel>
    <Border Height="2" Width="Auto" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
</StackPanel>

Codebehind of Window Two: Window的代码隐藏二:

       public MainWindow()
        {
            (App.Current as App).CodeText = _jediCode;
            InitializeComponent();
        }

        private void OnClickToDarkSide(object sender, RoutedEventArgs e)
        {
            (App.Current as App).ChangeSkin(Skin.Dark);
            (App.Current as App).CodeText = _sithCode;
            theTextBlock.Content = (App.Current as App).CodeText;
        }

        private void OnClickToLightSide(object sender, RoutedEventArgs e)
        {
            (App.Current as App).ChangeSkin(Skin.Light);
            (App.Current as App).CodeText = _jediCode;
            theTextBlock.Content = (App.Current as App).CodeText;
        }

        private void OnClickToGraySide(object sender, RoutedEventArgs e)
        {
            (App.Current as App).ChangeSkin(Skin.Gray);
            (App.Current as App).CodeText = _grayCode;
            theTextBlock.Content = (App.Current as App).CodeText;
        }

        private void OnClickOpenStyleWindow(object sender, RoutedEventArgs e)
        {
            if (StyleWindowButton.IsChecked == true)
            {
                styleWindow = new StyleWindow();
                styleWindow.Show();
            }
            else

            {
                styleWindow.Close();
                styleWindow = null;
            }


        }

        private void OnClickOpenTextWindow(object sender, RoutedEventArgs e)
        {
            if (TextWindowButton.IsChecked == true)
            {
                textWindow = new InputWindow();
                textWindow.Show();
            }
            else

            {
                textWindow.Close();
                textWindow = null;
            }
        }
    }

window one: window 一:

<Grid>
        <TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Height="200" Width="200" TextWrapping="Wrap" 
                 AcceptsReturn="True" AcceptsTab="True" Text="{Binding Path=CodeText, Source={x:Static Application.Current}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="10,10,0,0">
            <!-- TODO: trigger change from this textbox to the textblock in mainwindow -->
        </TextBox>
    </Grid>

code behind of one is empty.一个后面的代码是空的。

app.xaml.cs: app.xaml.cs:

public string CodeText
{
  get => _codeText;
  set { _codeText = value; OnPropertyChanged(nameof(CodeText)); }
}

Ok, the current behavior is clicking on one of the buttons (Dark Side, Gray, Light Side) leads to changes in the CodeText Property, which leads to a change of the content of the label of Window Two and the text of TextBox of Window One.好的,当前的行为是点击其中一个按钮(Dark Side, Gray, Light Side)导致CodeText Property发生变化,从而导致Window的label的内容和Window的TextBox的文本发生变化ZC895686A3837DABBC2一。 Changing the text of the TextBox, changes also the CodeText Property, but does not lead to a change in the label and thats confusing, why does it work the one way, but not the other.更改 TextBox 的文本,也更改了 CodeText 属性,但不会导致 label 的更改,这令人困惑,为什么它以一种方式工作,而另一种则不行。 hope you have a hint for me.希望你能给我一个提示。 :) Maybe i missed a trigger or a kind of refresh for the label :) 也许我错过了 label 的触发器或某种刷新

bindings in window One and Two are set differently. window One 和 Two 中的绑定设置不同。 (window Two does it wrong, Content="{Binding Source=CodeText}" is not valid binding) (窗口二做错了, Content="{Binding Source=CodeText}"无效绑定)

in fact, window Two removes the binding by assigning CodeText directly as local value:实际上,window 二通过将 CodeText 直接分配为本地值来移除绑定:

theTextBlock.Content = (App.Current as App).CodeText;

you should remove that line, and use the same binding as in window One:您应该删除该行,并使用与 window 一相同的绑定:

<Label Style="{DynamicResource LabelStyle}" x:Name="theTextBlock" 
       Content="{Binding Path=CodeText, Source={x:Static Application.Current}}"/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM