LoginSignup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

WPF(C#) ウィンドウ内のコントロールの値を操作し、別ウィンドウへ動的に反映させたい

Q&AClosed

WPFでアプリを作るためにプログラミングを最近勉強し始めました。
ツール:visual studio 2019
コード部分言語:C#

〇やりたいこと
2つのウィンドウを同時に常に表示して、
サブウィンドウの値を操作し、操作した値をメインウィンドウへ動的に反映させたいです。

画像のような雰囲気です。
サブウィンドウでXとYのSliderを動かして、それと連動させてメインウィンドウのサイズを変更したいです。
新規キャンバス1.png

同じウィンドウ内での値のバインディングはXAMLへの記述のみで出来たのですが、
別ウィンドウへのバインディングはXAMLの記述のみでは出来ないのでしょうか?

XAMLのみの記述でなくていいので、方法があれば教えていただきたいです。
また、親子関係(メイン、サブ)が逆でも可能でしょうか?

初心者なりに調べてみたのですが、「別ウインドウへの値の動的な反映」が出来そうな記事が見つけられなかったため質問させていただきました。

1

2Answer

もう用済みかもしれませんが・・・
以下でも動作しました。

〇サブウィンドウ

SliderWindow.xaml
<Window x:Class="BindingWindow.SliderWindow"
        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"
        xmlns:local="clr-namespace:BindingWindow"
        mc:Ignorable="d"
        Title="SliderWindow" Height="450" Width="800">
    <Grid>
        <StackPanel VerticalAlignment="Center">
            <Slider x:Name="sliderX"
                    Minimum="10"
                    Maximum="1000"
                    Margin="20"
                    Value="{Binding Width, Mode=TwoWay}" />
            <Slider x:Name="sliderY"
                    Minimum="10"
                    Maximum="1000"
                    Margin="20"
                    Value="{Binding Height, Mode=TwoWay}" />
        </StackPanel>
    </Grid>
</Window>

〇呼び出し

MainWindow.xaml.cs
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            new SliderWindow()
            {
                DataContext = this
            }.Show();
        }
    }

3

Comments

  1. @magurozaki

    Questioner
    ありがとうございます!
    DataContextについては結構、記述を見かけるのですが勉強中です…
    これを元にちょっと理解が深まりそうです!

    それにしても色々なアプローチがあるんですね……奥が深い。
    各手法のメリットデメリットがあると思うので
    ちょっと掘り下げて学んでみます📚

自分もXAML上でバインドする方法わからないです。(笑)
めちゃくちゃコードビハインドですが・・、
こういうやり方でやれないことも無いかと思います。
少しでも参考になれば幸いです^^

MainWindow.xaml
<Window x:Class="WindowSizeSlider.MainWindow"
        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"
        xmlns:local="clr-namespace:WindowSizeSlider"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
    </Grid>
</Window>

MainWindow.xaml.cs
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            SubWindow subWindow = new SubWindow();
            subWindow.Owner = this;
            subWindow.Show();
        }
    }
SubWindow.xaml
<Window x:Class="WindowSizeSlider.SubWindow"
        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"
        xmlns:local="clr-namespace:WindowSizeSlider"
        mc:Ignorable="d"
        Title="SubWindow" Height="450" Width="800">
    <StackPanel VerticalAlignment="Center">
        <Slider x:Name="sliderX" Minimum="10" Maximum="1000" Margin="20" ValueChanged="SliderX_ValueChanged"/>
        <Slider x:Name="sliderY" Minimum="10" Maximum="1000" Margin="20" ValueChanged="SliderY_ValueChanged"/>
    </StackPanel>
</Window>

SubWindow.xaml.cs
    public partial class SubWindow : Window
    {
        public SubWindow()
        {
            InitializeComponent();
        }

        private void SliderX_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (this.Owner != null)
            {
                this.Owner.Width = e.NewValue;
            }
        }

        private void SliderY_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (this.Owner != null)
            {
                this.Owner.Height = e.NewValue;
            }
        }
    }
1

Comments

  1. @magurozaki

    Questioner
    あれから調べたんですがXAMLだけでは厳しそうですね💦

    思ったより簡単なコードで出来るんですね!

    ありがとうございます<(_ _)>これで一歩進めます!

Your answer might help someone💌