操作用ウィンドウA と 閲覧用ウィンドウBがあり、
ウィンドウAとまったく同じ表示(コントロール、レイアウト諸々)をウィンドウBにさせたいです。
ただし、操作が可能なのはウィンドウAだけで、ウィンドウBは表示専用で一切の操作はできません。
例えば、ウィンドウA上にテキストボックスがあり、何か入力をした場合に、それがリアルタイムでウィンドウBに反映されるようなイメージ
※実際にはウィンドウA上でのアニメーションなどもウィンドウBに反映させたいです。
何か方法はありますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ウィンドウAとまったく同じ表示(コントロール、レイアウト諸々)をウィンドウBにさせたいです。
ただし、操作が可能なのはウィンドウAだけで、ウィンドウBは表示専用で一切の操作はできません。
WPFにはVisualBrush
という、超強力機能があります。
まさにこの目的にぴったりです^^
イメージ、描画、およびビジュアルによる塗りつぶし - WPF .NET Framework | Microsoft Docs
WPF 超入門 〜番外編「とある動画の同期再生」 - 周回遅れのブルース
xml
1<Window 2 x:Class="Questions375232.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="ウィンドウA" 6 Width="800" 7 Height="450"> 8 <StackPanel> 9 <TextBox Text="aaaaaaaaa" /> 10 <Button Content="a" /> 11 12 <Rectangle 13 Width="100" 14 Height="100" 15 Fill="Red" 16 RenderTransformOrigin="0.5,0.5"> 17 <Rectangle.RenderTransform> 18 <RotateTransform /> 19 </Rectangle.RenderTransform> 20 <Rectangle.Triggers> 21 <EventTrigger RoutedEvent="Loaded"> 22 <BeginStoryboard> 23 <Storyboard RepeatBehavior="Forever"> 24 <DoubleAnimation 25 Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 26 From="0" 27 To="360" 28 Duration="0:0:1" /> 29 </Storyboard> 30 </BeginStoryboard> 31 </EventTrigger> 32 </Rectangle.Triggers> 33 </Rectangle> 34 </StackPanel> 35</Window>
cs
1using System.Windows; 2using System.Windows.Data; 3using System.Windows.Media; 4 5namespace Questions375232 6{ 7 public partial class MainWindow : Window 8 { 9 public MainWindow() 10 { 11 InitializeComponent(); 12 13 var window = new Window 14 { 15 Background = new VisualBrush(this), 16 Title = "ウィンドウB", 17 ResizeMode = ResizeMode.NoResize, 18 }; 19 window.SetBinding(WidthProperty, new Binding("Width") { Source = this, Mode = BindingMode.TwoWay, }); 20 window.SetBinding(HeightProperty, new Binding("Height") { Source = this, Mode = BindingMode.TwoWay, }); 21 22 window.Show(); 23 } 24 } 25}
投稿2021/12/23 08:24
編集2023/07/29 13:33総合スコア9884
0
WPF触れたことないので 可能なのか/方法論として良いのか悪いのか 等々判断つきませんが…
- ウィンドウB側は画像を一枚表示できるだけの物とし,
- ウィンドウA側で何か変化があった際(?)に,ウィンドウAのスクリーンショットを撮り,ウィンドウB側の表示内容をその絵で更新する.
といった方向の話はどうでしょうか.
(その他,ウィンドウのサイズ変化とかにもまぁ相応に対処するとして)
投稿2021/12/23 08:16
総合スコア11996
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私なら2種類の方法が思いつきますね。
まず、Window1, WIndow2 とします。
Window1 は編集用, Window2は表示するだけとします。
そのとき、Window1,2の違いはなんでしょうか? そう、編集できるかどうかですね。
では、コードレベルで考えた時、どういう違いがあるでしょうか?
たとえば、一つはWinAPIを使って、もう一つは.NET Framework等のやつで作ったやつ…みたいな差がありますか?
普通に考えるとほとんど差がないはずです。せいぜい、button1.Enabled を falseにするかどうかとかそういうレベルのはずです。
そう考えると、Windows1のときはEnabledとかをtrueまたはデフォルトのままにして、Window2ではEnabled等をfalse等にするだけの差しかないはずですね。
ということは、CommonWindowクラスとかを作って共通化。そしてそのクラスのコンストラクタかメソッドあたりで『編集可能・不可能』を決める。
たとえば、
C#
1// 変更可能な方として生成 2CommonWindow window1 = new CommonWindow( true );
とかみたいにするとか。
Window1はWindows2のオブジェクトをフィールドとして保持して、『テキストボックスの値が変更されたら』系のイベントとかでデータを処理しつつWindow2にもその結果を渡して表示させるとか。
これが方法1。
もう一つの方法(方法2)は、方法1を『継承による表現』ですかね。
同じようにCommonWindowを作る。
それを継承してWindow1, Window2のクラスを作る。親であるCommonWindowのコンストラクタを呼び出すときに『編集可能かどうか』的な引数を渡すとか。
ただし、今回の場合、方法2はあまり良くない気がします。
オブジェクト指向系の言語で継承したりするのは『拡張のため』ではなく、『同一視するため』です。
Window1とWindow2を同一視して、内部処理はそのオブジェクトに任せるためのものです。なのでおすすめはしません。
ただ、この方法が有用な場合もあるので一例として出しています。
私なら単純に方法1でやりますね。
投稿2021/12/23 07:13
総合スコア4962
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/23 08:38