0

在 C# 中,使用 WPF 组件,是否可以在屏幕上的两个位置显示画布(其内容在运行时根据用户输入发生变化)?还是在两个窗口中?所以基本上,位于一个位置的画布中发生的任何事情都会发生在位于另一个位置的画布中。

4

4 回答 4

2

您是否需要它们都具有交互性?

如果没有,那么您可以使用 VisualBrush 将 Canvas 复制到另一个位置。VisualBrush 部分不会是交互式的,但它会反映另一个部分发生的情况。

于 2012-05-18T13:26:42.870 回答
1

如果您通过数据绑定填充和更新 Canvas,您可以创建一个定义 Canvas 及其所有样式、模板等的用户控件,并将该用户控件的每个实例绑定到同一个源对象。即使在不同的窗口中,因为它们是从内存中的同一个对象更新的,它们应该看起来是同步的。

于 2012-05-18T13:59:56.993 回答
1

所以,有两种解决方案:

  1. 创建包含您的画布的控件并将它们添加到所需的位置并绑定到您的虚拟机
  2. 使用@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);
}
于 2012-05-18T13:56:12.233 回答
0

我遇到了同样的问题,我被要求在其他窗口中显示画布,同时保留原始画布。

我所做的,你可以做的是:

由于一个孩子不能有多个父母,因此您可以通过使用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();
于 2012-05-18T13:44:37.503 回答