WPF C#:在页面加载时动态增加主窗口宽度
我试图通过增加页面的宽度和位置,在加载到页面时使用for循环来创建动画。我的问题是,for循环加载的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
页面中的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 [& 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();
}