C#では、WPFコンポーネントを使用して、画面上の2つの位置にキャンバス(ユーザー入力に基づいて実行時に内容が変化する)を表示できますか? または2つのウィンドウで?つまり、基本的に、ある場所に配置されたキャンバスで起こることは、別の場所に配置されたキャンバスで起こります。
4 に答える
両方をインタラクティブにする必要がありますか?
そうでない場合は、VisualBrushを使用してCanvasを別の場所に複製できます。VisualBrush部分はインタラクティブではありませんが、他の部分で発生することを反映します。
したがって、2 つの解決策があります。
- キャンバスを含むコントロールを作成し、それらを必要な場所に追加して VM にバインドします
@Timが言及したようにvisualbrushを使用します。例:
<Window x:Class="visualbrushmirroringstackoverflow.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <VisualBrush x:Key="MirrorBrush" Visual="{Binding ElementName=TargetCanvas}" TileMode="None" Stretch="None" AutoLayoutContent="False"/> </Window.Resources> <StackPanel> <Button Click="Button_Click" Content="Add Random Rects" Margin="5"/> <Border BorderThickness="1" BorderBrush="Black" Margin="5"> <Canvas x:Name="TargetCanvas" Width="100" Height="100" Background="White" /> </Border> <Border BorderThickness="1" BorderBrush="Black" Margin="5"> <Rectangle Width="100" Height="100" Fill="{StaticResource MirrorBrush}" /> </Border> </StackPanel>
コードビハインドのハンドラー:
private void Button_Click(object sender, RoutedEventArgs e)
{
var rnd = new Random();
var element = new Rectangle { Fill = Brushes.Black, Width = 5, Height=5 };
Canvas.SetLeft(element, rnd.Next(100));
Canvas.SetTop(element, rnd.Next(100));
TargetCanvas.Children.Add(element);
}
データ バインディングを使用して Canvas を設定および更新する場合は、Canvas とそのすべてのスタイル、テンプレートなどを定義するユーザー コントロールを作成し、そのユーザー コントロールの各インスタンスを同じソース オブジェクトにバインドできます。異なるウィンドウであっても、メモリ内の同じオブジェクトから更新されているため、同期されているように見えるはずです。
元のキャンバスを保持したまま、他のウィンドウにキャンバスを表示するように求められたのと同じ問題がありました。
私がしたこととあなたができることはこれです:
1 人の子が複数の親を持つことはできないため、XamlReader.Save
.
このキャンバスを ViewBox に配置します (その親に引き伸ばされるようにします)。新しいウィンドウのコンテンツをこの ViewBox として設定します。
Canvas copycanvas = XamlReader.Parse(XamlWriter.Save(OriginalCanvas)) as Canvas;
ViewBox vb = new ViewBox() { Stretch.Uniform, Child = copyCanvas };
Windows newwin = new Window() { Content = vb };
newwin.ShowDialog();