簡體   English   中英

WPF C#:在頁面加載時動態增加MainWindow的寬度

[英]WPF C#: Increase MainWindow width dynamically on page load

我試圖通過增加寬度和位置將其加載到頁面中時使用for循環來創建動畫。 我的問題是Page_Loaded for循環中的Application.Current.MainWindow.Width不起作用。 雖然它在離開頁面時效果很好。 我的代碼:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    for (double i = 0; i < 50; i++)
        {
                Application.Current.MainWindow.Left = Application.Current.MainWindow.Left - 2;
                Application.Current.MainWindow.Width = Application.Current.MainWindow.Width + 4;
        }
}

private void Home_Click(object sender, RoutedEventArgs e)
{
    NavigationService.GoBack();
        for (double i = 0; i < 50; i++)
        {
                Application.Current.MainWindow.Left = Application.Current.MainWindow.Left + 2;
                Application.Current.MainWindow.Width = Application.Current.MainWindow.Width - 4;
        }
}

當我轉到目標頁面時,我的窗口僅向左移動,但是直到頁面完全加載后寬度才增加,它只是跳到最終寬度而不是為其設置動畫。 當我離開頁面時,窗口和寬度都將同時更改。

在Page_Loaded下設置寬度時有一些限制嗎? 如果是這樣,我該如何克服?

XAML設置

  mc:Ignorable="d" 
  Loaded="Page_Loaded"
  Title="DatabaseViewer">

<Grid >
    <TextBlock Height="75" Margin="65,20,65,0" Text="Solder Paste Database" TextAlignment="Center" FontSize="30" VerticalAlignment="Top" />

    <Button Margin="0,17,30,0" Width="50" Height="50" FontSize="20" HorizontalAlignment="Right" VerticalAlignment="Top" BorderThickness="0" Click="Export_Click"
            Style="{DynamicResource SquareButtonStyle}" ToolTip="Export to Excel">
        <StackPanel>
            <Rectangle Width="40" Height="40" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="Green">
                <Rectangle.OpacityMask>
                    <VisualBrush Stretch="Uniform" Visual="{StaticResource appbar_office_excel}" />
                </Rectangle.OpacityMask>
            </Rectangle>
        </StackPanel>
    </Button>

    <DataGrid Name="dbGrid" Width="750" Height="340" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,20" 
              HorizontalContentAlignment="Center" IsReadOnly="True" PreviewKeyDown="dbGrid_KeyDown" GridLinesVisibility="All"
              BorderBrush="Black" BorderThickness="1" SelectionChanged="dbGrid_SelectionChanged" >
    </DataGrid>

    <Grid HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,70,25,0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="115"/>
            <ColumnDefinition Width="40"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>

        <Label FontSize="14" FontWeight="Bold" Grid.Column="0" Grid.Row="0" Content="Selected Count: " HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
        <Label FontSize="14" Grid.Column="1" Grid.Row="0" Content="0" HorizontalAlignment="Left" VerticalAlignment="Bottom" x:Name="selectedCount" />

    </Grid>

    <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Margin="25,70,0,0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150"/>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="26" />
        </Grid.RowDefinitions>

        <TextBox Width="150" FontSize="14" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" x:Name="TB" ToolTip="Column Name = Value [&amp; Column Name = Value]"/>
        <Button Margin="10,0,0,0" Padding="0,0,0,0" FontSize="14" Width="80" Content="Filter" Grid.Column="1" Grid.Row="0" VerticalContentAlignment="Center" 
                HorizontalAlignment="Left" VerticalAlignment="Bottom" Click="filter_click" />
        <Label Grid.Column="2" x:Name="filterLabel" Content="Invalid Search" Foreground="Red" FontWeight="Bold"/>
    </Grid>

    <Button Margin="20,27,0,0" Width="30" Height="30" FontSize="18" HorizontalAlignment="Left" Click="Home_Click" VerticalAlignment="Top" BorderThickness="0" UseLayoutRounding="True" BorderBrush="White"
        Style="{DynamicResource MetroCircleButtonStyle}" >
        <Rectangle Width="30" Height="30"
           Fill="#41b1ff">
            <Rectangle.OpacityMask>
                <VisualBrush Stretch="Uniform" Visual="{DynamicResource appbar_arrow_left}" />
            </Rectangle.OpacityMask>
        </Rectangle>
    </Button>
</Grid>

如您所見,使用顯式代碼在循環中更改尺寸很可能會導致批處理。 更不用說您在所有這些過程中都在阻止UI,因此讓您感到驚訝的是,您在循環期間看到了任何更改。

基本動畫的正確方法是使用WPF故事板。 在這里,您可以定義開始和結束條件,要設置的動畫(寬度,左)以及動畫要播放多長時間並告訴其播放。 然后,情節提要板將運行,而您無需執行任何其他操作。 您可以在代碼或純XAML中定義它。

MickyD是對的,在這種情況下,情節提要是最好的選擇。 盡管我可以通過在后面的代碼中循環來實現您想要的功能,但是您所看到的結果通常是有問題的。 例如,在您的情況下,您將需要制作一個DoubleAnimation來擴展Windows資源。

XAML

 <Window.Resources>
    <Storyboard x:Key="sb2">
        <DoubleAnimation Storyboard.TargetName="myWindowName" Storyboard.TargetProperty="Width" From="500" To="1200" Duration="0:0:3"  AutoReverse="False"/>
        <DoubleAnimation Storyboard.TargetName="myWindowName" Storyboard.TargetProperty="Left" From="500" To="200" Duration="0:0:3"  AutoReverse="False"/>
    </Storyboard>
 </Window.Resources>

然后在“窗口(或控件) Loaded事件中

 private void myWindowName_Loaded(object sender, RoutedEventArgs e)
 {
      //Reference System.Windows.Media.Animation;
      Storyboard storyBoardIn = (Storyboard)TryFindResource("sb2");
      storyBoardIn.Begin();
 }

顯然,您將需要在XAML中更改情節提要參數,以實現所需的確切功能。 在WPF中,此解決方案的代碼更少,更可靠。 祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM