c# - WPF 如何确定应该重绘某些内容?我怎么知道?

标签 c# wpf opengl

好吧,这对 WPFish 基础非常深入,但请参阅:

简短:如何实现我自己的 RenderThread。

我正在解决一个问题,我需要在 WPF 应用程序中显示 10 位。由于这个和其他原因,它必须是 OpenGL(它能够很好地处理 10 位)。绑定(bind)和 WPF 控件是众所周知的,它们的功能深受我们喜爱。所以对于少数控件,我希望使用它们,甚至可能在我的 OpenGL 上下文中绘制它们。

有趣的是,我使用自己的 PresentationSource 将 WPF 的某些部分作为独立的对象树工作。布局有效,但事件目前确实由于缺少部分(焦点)而失败。可能事件永远不会起作用,因为它不可能从某些内部类派生,例如 CompositionTarget ... :-/

但是:

所以我可以在我的 OpenGL 上下文中进行我自己的绘图(只是一对按钮和边框)但是我无法忘记检查 WPF Visual-Tree 的想法,捕获所有的 DrawingGroups 并在 OpenGL 中重做绘画。

我得到的是一棵 DrawingGroupsEllipseGeometryRectangleGeometry 树 - 如此可绘制的基元。

    DrawingGroup drawing = VisualTreeHelper.GetDrawing((Visual) firstChild);

这个想法的问题是:我如何确定/我的可视化树是否已经改变。我的意思不是全部,而是那里的依赖属性。说明:有一个 WPF 覆盖 protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) 但据我观察,它调用的频率不够。我想观察的是:当动画发生时,它会为例如宽度或不透明度或作为视觉树一部分的画笔设置动画。然后,我需要重新绘制我的 OpenGL 上下文。 WPF 如何确定以及我如何观察?

最佳答案

我认为LayoutUpdated应该给你你需要的。

考虑这个代码示例: XAML:

<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" Width="525" Loaded="MainWindow_OnLoaded">
    <StackPanel>
        <Canvas x:Name="TargetCanvas"  Height="300">
            <Rectangle x:Name="Subject" Canvas.Top="50" Canvas.Left="50" Fill="Maroon" Height="25" Width="25"/>
        </Canvas>
        <Button Content="Move">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard>
                        <Storyboard Target="{Binding ElementName=Subject}" TargetProperty="(Canvas.Left)" AutoReverse="True">
                            <DoubleAnimation To="200" Duration="00:00:02"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </StackPanel>
</Window>

和代码背后:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        TargetCanvas.LayoutUpdated += TargetCanvas_LayoutUpdated;
    }

    void TargetCanvas_LayoutUpdated(object sender, EventArgs e)
    {
        Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + ": Layout updated\n");
    }
}

关于c# - WPF 如何确定应该重绘某些内容?我怎么知道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30301587/

相关文章:

c++ - 使用顶点缓冲区的直接状态访问

支持 OpenGL 的 C++ GUI 工具包

c# - VS 2019中如何在非grpc服务项目中添加proto文件

c# - 无法在 ASP.NET Core 中使用带有 Identity 的 MySql 数据库

c# - 带有扩展 WPF 工具包的 MessageBox 的默认 Windows 主题

wpf - DateTimePicker 设置日历和时间文化

c++ - OpenGL:调用 glewInit() 后 glGetError() 返回无效枚举

c# - 使用 Null SOAP WSDL

c# - 在 C# 中将参数传递给 Web 服务方法

c# - 如何在*不*使用绑定(bind)的情况下针对对象评估 PropertyPath? (即绑定(bind)本身使用什么?)