2017-02-12 60 views
0

这可能是一个愚蠢的问题,但我一直在寻找几个小时才能得到答案。c#wpf刷新绘制的矩形画布

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

这就是我的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()等一些soloutings,但没有任何作品.. 对不起,新来的C#,只能通过做。

回答

0

使用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)); 
} 

另外请注意,您应该是否设置绑定的ElementName到当前控件或设置适当的DataContext。例如:

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

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

+0

看到[这个答案](http://stackoverflow.com/a/13956932/5615980) – Ron