4

レイアウト測定値の更新を強制する方法は?

問題のあるレイアウトを単純化しました。最初にボタンをクリックすると、1 つの測定値が取得され、2 回目に別の測定値がクリックされます。

   private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        var w = mywindow.ActualWidth;
        gridx.Width = w;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        btn3.Width = 100;
        var w = mywindow.ActualWidth;
        gridx.Width = w - btn3.Width;
        InvalidateArrange();
        InvalidateMeasure();

        MessageBox.Show(btn1.ActualWidth.ToString());
    }

<Window x:Class="resizet.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" Name="mywindow">

        <DockPanel HorizontalAlignment="Stretch" LastChildFill="False">
            <Grid HorizontalAlignment="Stretch" DockPanel.Dock="Left" Name="gridx">
                <Button HorizontalAlignment="Stretch" Content="btn in grid" Click="Button_Click" />
            </Grid>
        <Button Name="btn2" Content="btn2" Width="0" DockPanel.Dock="Right" HorizontalAlignment="Left"></Button>
        </DockPanel>
</Window>
4

2 に答える 2

8

これで問題が解決します。

btn3.Width = 100;    
btn3.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
var w = mywindow.ActualWidth;
gridx.Width = w - btn3.Width;

追加で

private static Action EmptyDelegate = delegate() { };
于 2013-05-30T19:10:56.460 に答える