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
不会更新。 我确实明白这一点,但当我使用codebehind
copycanvas
中的故事板制作动画时,动画不会更新

我需要做什么才能使
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();
    }        
}