質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

638閲覧

ウィンドウを複写したい

Mashimasa

総合スコア50

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/12/23 05:48

操作用ウィンドウA と 閲覧用ウィンドウBがあり、

ウィンドウAとまったく同じ表示(コントロール、レイアウト諸々)をウィンドウBにさせたいです。
ただし、操作が可能なのはウィンドウAだけで、ウィンドウBは表示専用で一切の操作はできません。

例えば、ウィンドウA上にテキストボックスがあり、何か入力をした場合に、それがリアルタイムでウィンドウBに反映されるようなイメージ
※実際にはウィンドウA上でのアニメーションなどもウィンドウBに反映させたいです。

何か方法はありますでしょうか。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
TN8001

総合スコア9242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mashimasa

2021/12/23 08:38

まさに探し求めていたものはこれです!! 『WPF キャプチャ』などで検索しても画面のスクリーンショットを取る方法しかでてこず困っていました。 助かりました。ありがとうございます。
guest

0

WPF触れたことないので 可能なのか/方法論として良いのか悪いのか 等々判断つきませんが…

  • ウィンドウB側は画像を一枚表示できるだけの物とし,
  • ウィンドウA側で何か変化があった際(?)に,ウィンドウAのスクリーンショットを撮り,ウィンドウB側の表示内容をその絵で更新する.

といった方向の話はどうでしょうか.
(その他,ウィンドウのサイズ変化とかにもまぁ相応に対処するとして)

投稿2021/12/23 08:16

fana

総合スコア11632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mashimasa

2021/12/23 08:33

回答ありがとうございます。 スクリーンショットも考えたのですが、それだとアニメーションが再現できないんです.....。
guest

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

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mashimasa

2021/12/23 08:36

回答ありがとうございます。 オブジェクトを共有するんですね。 ウィンドウの処理も結構複雑だったりするので、もっと簡単な方法があれば良いなと思った次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問