WPF C#:在页面加载时动态增加主窗口宽度

WPF C#:在页面加载时动态增加主窗口宽度,c#,wpf,C#,Wpf,我试图通过增加页面的宽度和位置,在加载到页面时使用for循环来创建动画。我的问题是,for循环加载的页面中的Application.Current.MainWindow.Width不起作用。虽然它在离开页面时工作得很好。我的代码: private void Page_Loaded(object sender, RoutedEventArgs e) { for (double i = 0; i < 50; i++) { Applicat

我试图通过增加页面的宽度和位置,在加载到页面时使用for循环来创建动画。我的问题是,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;
        }
}
private void页面\u已加载(对象发送方,路由目标)
{
对于(双i=0;i<50;i++)
{
Application.Current.mainfown.Left=Application.Current.mainfown.Left-2;
Application.Current.MainWindow.Width=Application.Current.MainWindow.Width+4;
}
}
私有void Home\u单击(对象发送方,路由目标)
{
NavigationService.GoBack();
对于(双i=0;i<50;i++)
{
Application.Current.mainfown.Left=Application.Current.mainfown.Left+2;
Application.Current.MainWindow.Width=Application.Current.MainWindow.Width-4;
}
}
当我转到预期的页面时,我的窗口只是向左移动,但在页面完全加载之前宽度不会增加,它只是跳到最终宽度,而不是设置动画。当我离开页面时,我的窗口和宽度都在一起改变

在设置加载页面下的宽度时是否有一些限制?如果是这样的话,我该如何克服呢

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>
mc:Ignorable=“d”
已加载=“已加载页面”
Title=“DatabaseViewer”>

如您所见,使用显式代码更改循环中的维度很可能会导致批处理。更不用说你在这期间阻塞了UI,所以我很惊讶你在循环期间看到了任何变化

正确的动画制作方法是使用WPF故事板。在这里,您将定义开始和结束条件、要设置动画的内容(宽度,左侧)以及动画应运行多长时间并告诉它播放。故事板然后运行,而无需再做任何事情。您可以用代码或直接使用XAML来定义它


米基德是对的,在这种情况下,故事板是最好的选择。虽然我可以通过在代码背后循环来实现您想要的,但正如您所看到的,结果往往是错误的。例如,在您的情况下,您可能希望制作一个
DoubleAnimation
,以便在Windows资源中进行扩展

XAML


显然,您需要更改XAML中的故事板参数,以获得您想要的内容。该解决方案在WPF中代码更少,更可靠。祝你好运

this.Dispatcher.Invoke(()=>{Application.Current.MainWindow.Width=Application.Current.MainWindow.Width+4;})我尝试了这个,但没有成功。你能发布你试图设置动画的窗口属性的XAML吗。它在我这边工作,所以我很好奇是什么阻止了它。当你已经在UI上时,使用Dispatcher.Invoke是毫无意义的thread@Tronald我用XAML代码更新了这个问题,当我在窗口中完成时,它可以工作,但是当我试图在我的页面中引用它时,没有动画发生<代码>主窗口mw=新的主窗口();mw.增加_宽度()这是因为您必须调用现有窗口,而不是创建新窗口。你可以通过你的页面构造器来传递现有的动画。太棒了,我用C#来创建和处理动画,效果很好<代码>DoubleAnimation mydoubleanimation=新建DoubleAnimation();mydoubleanimation.From=600;mydoubleanimation.To=800;mydoubleanimation.Duration=新的持续时间(TimeSpan.FromSeconds(1));Storyboard.SetTarget(mydoubleanimation,Application.Current.MainWindow);Storyboard.SetTargetProperty(mydoubleanimation,新属性路径(MainWindow.WidthProperty));故事板mystoryboard=新故事板();mytoryboard.Children.Add(mydoubleanimation);mystoryboard.开始(这个)
 <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>
 private void myWindowName_Loaded(object sender, RoutedEventArgs e)
 {
      //Reference System.Windows.Media.Animation;
      Storyboard storyBoardIn = (Storyboard)TryFindResource("sb2");
      storyBoardIn.Begin();
 }