C# 克隆画布到动态viewbox WPF
具有一个主窗口和一个画布类C# 克隆画布到动态viewbox WPF,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,具有一个主窗口和一个画布类Graphcontext,其中动画和多个形状相互作用,如: xaml 我想在第二个监视器中的其他最大化画布中克隆GraphContext,可能使用Viewbox 我试过了 Canvas copycanvas = XamlReader.Parse(XamlWriter.Save(graphSurface)) as Canvas; Viewbox vb = new Viewbox() { StretchDirection = StretchDirection.Both, S
Graphcontext
,其中动画和多个形状相互作用,如:
xaml
我想在第二个监视器中的其他最大化画布中克隆GraphContext
,可能使用Viewbox
我试过了
Canvas copycanvas = XamlReader.Parse(XamlWriter.Save(graphSurface)) as Canvas;
Viewbox vb = new Viewbox() { StretchDirection = StretchDirection.Both, Stretch=Stretch.Uniform };
vb.Child = copycanvas;
Window newwin = new Window() { Content = vb };
newwin.Show();
但是,当更新graphSurface
时,copycanvas
不会更新。
我确实明白这一点,但当我使用codebehindcopycanvas
中的故事板制作动画时,动画不会更新
我需要做什么才能使copycanvas
始终是图形表面的镜像
我是否需要将所有逻辑复制到其他控件中?这样,它总是相同的,可能会有一点延迟
也许将画布数据绑定到viewbox可以做到这一点,但会是怎样的呢?当您在wpf中启动代码时,您应该停止像对待过去的编程语言那样对待元素
您必须使用MVVM模式才能正确地完成任务
这是通过设置窗口的数据上下文来完成的
m-v-vm模式有哪些东西
视图模型:
类使用一些公共属性实现INotifyPropertyChanged,这些属性在设置时引发事件propertychanged
初始化子开关添加圆位置、颜色等数据
视图:
xaml witch data bind to view model puplic properties with binding mods您可以通过一种->方式(到目标)、两种方式绑定数据,一种是在view model类中生成一些数据
-->启动新窗口-->将窗口数据上下文设置为新视图\ U模型
假设您希望从视图中获取数据,如列表当前项
您应该将所选的_index属性绑定到“单向到源”模式,以便它在view_model类中更改绑定到它的相应属性
然后,您可以检查主窗口(模型)中的属性是否已更改,这就是MVVM的工作原理
请不要从视图中获取元素。您应该从视图中获取(视图\模型类)类型的数据
wpf中的屏幕仅用于发布数据,不要抛出子/父关系,最终您将被卡住,您可以使用;
因此,基本上,您只需创建一个VisualBrush
,并将当前的GraphContext
数据绑定到它的Visual
属性,从而创建GraphContext
的重复图像
主窗口中的代码:
MirrorWindow newwin = new MirrorWindow ();
newwin.DataContext = graphSurface;
newwin.Show();
镜像窗口的XAML:
<Grid>
<Grid.Background>
<VisualBrush Stretch="Uniform" Visual="{Binding}"/>
</Grid.Background>
</Grid>
<Window x:Class="WpfApplication1.Mirror"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Mirror" Height="300" Width="300">
<Grid>
<Grid.Background>
<VisualBrush Stretch="Fill" Visual="{Binding}"/>
</Grid.Background>
</Grid>
</Window>
结果:
鼠标点击“代码>主窗口< /代码>,主窗口< /代码>和<代码>镜像< /代码>将显示颜色变化动画。您是否考虑将画布渲染为位图并简单地显示位图?这样,您甚至可以通过一个简单的网络共享传递图像,并拥有自己的远程桌面。您可以将CopyCanvas
更改为一个属性,该属性只需将XamlReader.Parse(XamlWriter.Save(ORIGINALCANVAS))作为画布返回即可代码>;数据将CopyCanvas
绑定到您的ViewBox
,并在OriginalCanvas
更新时提升propertyChanged(“CopyCanvas”)
。这种想法适用于在OriginalCanvas上观看的动画和故事板吗?@cMinor您是指位图还是xml解析的想法?@Koopakiller我是指xml解析。但我不知道位图渲染是否支持多个动画,因为我需要高质量的Welcome@ahmed Mobarako,你应该按照以下准则重新格式化你的答案::)也许你的网站应该在这方面帮助我that@Ahmed但是如何使用主窗口Datacontext关闭窗口功能?通过将其他窗口Datacontext设置为相同的当前Datacontext对象,若你们告诉我你们从项目中的方法,也许我可以进一步帮助你们。那个么使用DataContext,MirrorWindow会更新graphSurface中的每一个更改吗?包括所有动态动画?@cMinor,是的。使用现有的视觉效果,这会创建目标视觉效果的重复图像。您可以发布示例项目来奖励赏金吗?@cMinor,添加了一个简单的。
<Grid>
<Grid.Background>
<VisualBrush Stretch="Uniform" Visual="{Binding}"/>
</Grid.Background>
</Grid>
<Window x:Class="WpfApplication1.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">
<Grid>
<Canvas Background="Black" x:Name="graphSurface">
<Canvas.Triggers>
<EventTrigger RoutedEvent="MouseDown">
<BeginStoryboard>
<Storyboard>
<ColorAnimation To="Red" Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" FillBehavior="Stop" Duration="0:0:5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
</Canvas>
</Grid>
</Window>
<Window x:Class="WpfApplication1.Mirror"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Mirror" Height="300" Width="300">
<Grid>
<Grid.Background>
<VisualBrush Stretch="Fill" Visual="{Binding}"/>
</Grid.Background>
</Grid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Mirror mm = new Mirror();
mm.DataContext = this.graphSurface;
mm.Show();
}
}