【问题标题】:c# wpf refresh a canvas with drawn rectanglesc# wpf 用绘制的矩形刷新画布
【发布时间】:2017-06-30 05:07:28
【问题描述】:

这对你来说可能是个愚蠢的问题,但我一直在寻找几个小时的答案。

我的主窗口中有一个带有一些矩形的画布。使用文本框和按钮,我想修改矩形(和画布)的宽度。

这是我的 wpf 代码:

<Canvas Name="IV" Width="{Binding Path=Länge}" Height="280" VerticalAlignment="Top" Margin="443,22,443.5,0">
        <Rectangle Canvas.Left="0" Canvas.Top="157.5" Width="{Binding Path=Länge}" Height="136" Name="rect3704" Fill="#FF999999" StrokeThickness="0.26458332"/>
        <Rectangle Canvas.Left="0" Canvas.Top="20.5" Width="{Binding Path=Länge}" Height="136" Name="rect37047" Fill="#FF999999" StrokeThickness="0.26458332"/>
        <Rectangle Canvas.Left="0" Canvas.Top="294.5" Width="{Binding Path=Länge}" Height="2.5" Name="rect3721" Fill="#FF999999" StrokeThickness="0.26458332"/>
        <Rectangle Canvas.Left="0" Canvas.Top="17" Width="{Binding Path=Länge}" Height="2.5" Name="rect37217" Fill="#FF999999" StrokeThickness="0.26458332"/>
        <Rectangle Canvas.Left="0" Canvas.Top="293.5" Width="{Binding Path=Länge}" Height="1" Name="rect3738" Fill="#FF333333" StrokeThickness="0.26458332"/>
        <Rectangle Canvas.Left="0" Canvas.Top="156.5" Width="{Binding Path=Länge}" Height="1" Name="rect37386" Fill="#FF333333" StrokeThickness="0.26458332"/>
        <Rectangle Canvas.Left="0" Canvas.Top="19.5" Width="{Binding Path=Länge}" Height="1" Name="rect373867" Fill="#FF333333" StrokeThickness="0.26458332"/>
    </Canvas>

我的 c# 代码是这样的

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

    }
    public int Länge { get; set; } = 50;



    public void button_Click(object sender, RoutedEventArgs e)
    {
        int Length = Convert.ToInt32(textBox.Text);
        Länge = Length;
        IV.InvalidateVisual();
        IV.InvalidateMeasure();
        IV.UpdateLayout();
        Action emptyDelegate = delegate { };
        IV.Dispatcher.Invoke(emptyDelegate, DispatcherPriority.Render);
        MessageBox.Show(Convert.ToString(Länge));


    }
}

如果我修改声明变量“Länge”的起始值,矩形将采用指定的宽度。但是通过按钮的更新除了消息框之外什么都不做。如您所见,我尝试了一些类似 Dispatcher.Invoke 或 canvas.InvalidateVisual() 等的独奏,但这些都不起作用。 抱歉,C# 新手,只能边做边学。

【问题讨论】:

    标签: c# wpf canvas refresh rectangles


    【解决方案1】:

    使用DependencyPropety,它应该可以工作:

        public int Länge
        {
            get { return (int)GetValue(LängeProperty); }
            set { SetValue(LängeProperty, value); }
        }
        public static readonly DependencyProperty LängeProperty =
          DependencyProperty.Register(
          "Länge ", typeof(int), typeof(MainWindow), new PropertyMetadata(50));
    

    没有必要使度量或其他东西无效:

    public void button_Click(object sender, RoutedEventArgs e)
    {
        int Length = Convert.ToInt32(textBox.Text);
        Länge = Length;
        MessageBox.Show(Convert.ToString(Länge));
    }
    

    另外,请注意您应该将 Binding ElementName 设置为当前控件还是设置正确的 DataContext。像这样的:

    Width="{Binding ElementName=window, Path=Länge}"
    

    其中“window”是MainWindow的名称,在MainWindow.Xaml中。

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2019-09-01
      相关资源
      最近更新 更多