在C#中,使用WPF组件,是否可以在屏幕上的两个位置显示画布(其内容根据用户输入在运行时更改)?还是在两个窗口?所以基本上,在位于一个地方的画布中发生的任何事情都发生在位于另一个地方的画布上。
答案 0 :(得分:2)
你需要他们两个互动吗?
如果没有,那么您可以使用VisualBrush将Canvas复制到另一个位置。 VisualBrush部分不是交互式的,但它将反映另一部分发生的事情。
答案 1 :(得分:1)
所以,有两个解决方案:
使用visualbrush作为@Tim提到,例如:
<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);
}
答案 2 :(得分:1)
如果您通过数据绑定填充和更新Canvas,则可以创建一个usercontrol来定义Canvas及其所有样式,模板等,并将该usercontrol的每个实例绑定到同一个源对象。即使在不同的窗口中,由于它们是从内存中的同一对象进行更新,因此它们应该显示为同步。
答案 3 :(得分: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();