C# WPF-将图像绘制到画布,并重复擦除和重画

C# WPF-将图像绘制到画布,并重复擦除和重画,c#,wpf,canvas,drawing,slider,C#,Wpf,Canvas,Drawing,Slider,我目前在WPF应用程序中有一个带有图像背景的画布。在这个画布上方,我有一个滑块控件。当用户来回滑动滑块的值时,我需要在画布上画一条红线。每次更改滑块值时,我都需要这样做,以便红线始终与滑块的拇指对齐。我在这里遇到的一个大问题是试图找出如何有效地绘制线,然后“擦除”以前绘制的线,并在用户更改滑块值时以新的拇指值绘制一条新线。如果我只是简单地重画画布的背景图像,应用程序会滞后很多,工作不好(另外,这并不能完全解决问题,因为您仍然可以看到以前绘制的线条) 任何帮助都将不胜感激,特别是在示例中,因为这是

我目前在WPF应用程序中有一个带有图像背景的画布。在这个画布上方,我有一个滑块控件。当用户来回滑动滑块的值时,我需要在画布上画一条红线。每次更改滑块值时,我都需要这样做,以便红线始终与滑块的拇指对齐。我在这里遇到的一个大问题是试图找出如何有效地绘制线,然后“擦除”以前绘制的线,并在用户更改滑块值时以新的拇指值绘制一条新线。如果我只是简单地重画画布的背景图像,应用程序会滞后很多,工作不好(另外,这并不能完全解决问题,因为您仍然可以看到以前绘制的线条)


任何帮助都将不胜感激,特别是在示例中,因为这是我在C#中的第一个WPF应用程序,我仍在感受它的独特性(与Windows窗体相反)。非常感谢

与其自己画线,不如用一个对象来画线。看见由于希望直线与滑块对齐,因此可以使用数据绑定将直线的X位置绑定到滑块的位置:

<DockPanel>
    <Slider
        Name="HorizontalSlider"
        DockPanel.Dock="Top"
        Maximum="{Binding ActualWidth, ElementName=Canvas}"/>
    <Canvas Name="Canvas" Margin="5.5 0">
        <Line
            X1="{Binding Value, ElementName=HorizontalSlider}"
            Y1="0"
            X2="{Binding Value, ElementName=HorizontalSlider}"
            Y2="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Canvas}}"
            Stroke="Red"/>
    </Canvas>
</DockPanel>


(请注意,我将画布上的边距设置为5.5有点作弊。滑块上的拇指有一定的厚度,不会移动滑块控件的整个宽度,因此为了使线条与中心对齐,我尝试使画布与轨迹具有相同的宽度。)

太棒了!我从未在WPF中使用过这样的绑定;它看起来非常有用,而且似乎工作得非常好!不过,我还有一个问题要问你。有没有办法将X1绑定到“Value*3”而不仅仅是“Value”的东西上?我的背景图像非常大,因此我将其缩小以适合画布,但是,我需要绘制线条,不是在slider.Value处,而是在该值乘以3处(因为我将滑块的最大值设置为3000,但图像只有1000像素长)?再次感谢@JToland:一般来说,要做这样的事情,需要在绑定上放置一个转换器。有关更多信息,请阅读IValueConverter的文档。在这种情况下,您可能只想将滑块的最大值绑定到图像的宽度,而不是画布的宽度,以便最大值仅为1000。