c# wpf 用绘制的矩形刷新 canvas
c# wpf refresh a canvas with drawn rectangles
这对你来说可能是个愚蠢的问题,但我已经花了好几个小时来寻找答案。
我的主 Window 中有一个 Canvas 和一些矩形。使用文本框和按钮,我想修改矩形的宽度(和 Canvas。)
这是我的 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() 等,但是 none 有效。
抱歉,C# 新手,只有边做边学。
使用 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.
这对你来说可能是个愚蠢的问题,但我已经花了好几个小时来寻找答案。
我的主 Window 中有一个 Canvas 和一些矩形。使用文本框和按钮,我想修改矩形的宽度(和 Canvas。)
这是我的 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() 等,但是 none 有效。 抱歉,C# 新手,只有边做边学。
使用 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.