@magurozaki
Revisions
Report this question
Subscribe question
Help us understand the problem. What is going on with this question?
Q&A
Closed

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

Q&A
Closed

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

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

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

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

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

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

0
2
Answer

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

〇サブウィンドウ

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();
        }
    }

2
ありがとうございます!
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
あれから調べたんですがXAMLだけでは厳しそうですね💦

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

ありがとうございます<(_ _)>これで一歩進めます!
Help us understand the problem. What is going on with this answer?
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login