2017-02-12 5 views
0

это может быть глупым вопросом для вас, но я искал часы, чтобы получить ответ на этот вопрос.C# wpf обновить холст с нарисованными прямоугольниками

У меня есть холст в моем главном окне с некоторыми прямоугольниками. С TextBox и Button, я хочу изменить ширину прямоугольниками

Это мой МОФ код (и Canvas.):

<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#, только учитесь.

ответ

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

Кроме того, обратите внимание, что вы должны установить, является ли Binding ELEMENTNAME к текущий контроль или установить правильный DataContext. Что-то вроде этого:

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

, в котором «окно» является именем MainWindow, в MainWindow.xaml.

+0

см. [Этот ответ] (http://stackoverflow.com/a/13956932/5615980) – Ron