WPF 加载框
Posted 安静点--
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 加载框相关的知识,希望对你有一定的参考价值。
加载框代码:
<UserControl x:Class="WpfApp1.LoadingForm" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Background="Transparent" Height="80" Width="125" BorderThickness="0"> <Grid> <Border CornerRadius="6" Background="#D7D9DB" BorderThickness="1" BorderBrush="#f6f5ec"> </Border> <TextBlock HorizontalAlignment="Center" Foreground="#4DA4FF" FontSize="16" Canvas.Top="69" Canvas.Left="33" Height="23" VerticalAlignment="Bottom" Width="100" Margin="12,0,13,5"><Run Text=" "/><Run Text=" "/><Run Text="Loading"/></TextBlock> <Grid x:Name="LayoutRoot" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="32,8,33,12"> <Grid.RenderTransform> <ScaleTransform x:Name="SpinnerScale" ScaleX="1.0" ScaleY="1.0" /> </Grid.RenderTransform> <Canvas RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="60" Margin="0,-9,0,9" > <Ellipse Width="3" Height="14" Canvas.Left="20" Canvas.Top="15" Stretch="Fill" Fill="#4DA4FF" Opacity="1.0" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-46.602"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Ellipse Width="3" Height="14" Canvas.Left="17" Canvas.Top="23" Stretch="Fill" Fill="#4DA4FF" Opacity="1" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="90.301"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Ellipse Width="3" Height="14" Canvas.Left="38" Canvas.Top="32" Stretch="Fill" Fill="#4DA4FF" Opacity="1" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-47.324"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Ellipse Width="3" Height="14" Canvas.Left="20" Canvas.Top="32" Stretch="Fill" Fill="#4DA4FF" Opacity="1" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="46.473"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Ellipse Width="3" Height="14" Canvas.Left="29" Canvas.Top="35" Stretch="Fill" Fill="#4DA4FF" Opacity="1" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-0.32"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Ellipse Width="3" Height="14" Canvas.Left="40" Canvas.Top="23" Stretch="Fill" Fill="#4DA4FF" Opacity="1" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="89.639"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Ellipse Width="3" Height="14" Canvas.Left="29" Canvas.Top="12" Stretch="Fill" Fill="#4DA4FF" Opacity="1"/> <Ellipse Width="3" Height="14" Canvas.Left="38" Canvas.Top="15" Stretch="Fill" Fill="#4DA4FF" Opacity="1" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-132.963"/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> <Canvas.RenderTransform> <RotateTransform x:Name="SpinnerRotate" Angle="0" /> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent="ContentControl.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName ="SpinnerRotate" Storyboard.TargetProperty ="(RotateTransform.Angle)" From="0" To="360" Duration="0:0:01" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas> </Grid> </Grid> </UserControl>
后台
namespace WpfApp1 /// <summary> /// LoadingForm.xaml 的交互逻辑 /// </summary> public partial class LoadingForm : UserControl private readonly DispatcherTimer animationTimer; public LoadingForm() InitializeComponent(); animationTimer = new DispatcherTimer(DispatcherPriority.ContextIdle, Dispatcher); animationTimer.Interval = new TimeSpan(0, 0, 0, 0, 75); //指定时间间隔
使用示例:
前端代码
<Window x:Class="WpfApp1.PageWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:CustomSystemWindow.CustomWindow" xmlns:ss="clr-namespace:WpfApp1" mc:Ignorable="d" Title="PageWindow" WindowState="Maximized" Height="802" Width="1279" Background="AliceBlue"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="10"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Background="Gray" Grid.Column="0" Text="左侧测试"/> <GridSplitter Grid.Row="0" Grid.Column="1" Width="10" HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Gray" /> <Grid Grid.Column="2" VerticalAlignment="Bottom" > <Grid.RowDefinitions> <RowDefinition Height="10" /> <RowDefinition Height="200" /> </Grid.RowDefinitions> <Button Height="100" Grid.Row="1" Click="Button_Click" Width="100" Content="右下测试"/> <GridSplitter Grid.Row="0" Height="10" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Background="Red"/> </Grid> <Grid Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" Width="125" Height="80" > <ss:LoadingForm x:Name="LoadingForm" Visibility="Hidden"/> </Grid> </Grid> </Window>
后台:
namespace WpfApp1 /// <summary> /// PageWindow.xaml 的交互逻辑 /// </summary> public partial class PageWindow : Window public PageWindow() InitializeComponent(); private void Button_Click(object sender, RoutedEventArgs e) LoadingForm.Visibility = Visibility.Visible; var task = Task.Factory.StartNew( () => Thread.Sleep(2000); MessageBox.Show("ssss"); , TaskCreationOptions.LongRunning); task.ContinueWith((t) => test(); ); private void test() Action action = () => LoadingForm.Visibility = Visibility.Hidden; ; this.Dispatcher.Invoke(action);
结果:
如何强制 WPF 绑定刷新?
【中文标题】如何强制 WPF 绑定刷新?【英文标题】:How to force a WPF binding to refresh? 【发布时间】:2011-08-06 06:43:58 【问题描述】:我有一个组合框,其中包含使用简单绑定附加的项目源。加载组合框后,有什么方法可以刷新此绑定?
【问题讨论】:
简单绑定是什么意思?通常,当您使用绑定时,控件应该会自动刷新。 技术人员,没有冒犯,但我相信 H.B.值得他的回答被接受;-) @Dani 我不确定 Techee 是否会回来 - 自他登录以来已有六年半时间 【参考方案1】:您可以使用绑定表达式:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
但是as Blindmeis noted 您也可以触发更改通知,如果您的集合实现了INotifyCollectionChanged
(例如在ObservableCollection<T>
中实现),它将同步,因此您无需执行任何操作。
【讨论】:
使用 ListBox 似乎对我没有任何帮助。 @JonathanWood:嗯,我不知道你有什么样的代码,包括你的绑定是什么样的。绑定是否一开始就有效?【参考方案2】:如果您使用 mvvm 并且您的 itemssource 位于您的 vm 中。当您想要刷新时,只需为您的集合属性调用 INotifyPropertyChanged。
OnPropertyChanged("YourCollectionProperty");
【讨论】:
这是最干净的方法恕我直言。 这应该在可能的情况下完成,但应该注意它并不总是实用的。例如,如果您要绑定到串行端口,并且想要检查它是否打开、关闭、波特率等,您可以在实现INotifyPropertyChanged
的串行端口周围创建一个包装类,但您必须保留该包装器的私有端口,因此需要为您在项目其他地方使用的该端口上的所有内容编写属性和方法,以确保您有兴趣通知的属性始终通过包装器
另外,我非常喜欢使用 nameof(YourCollectionProperty)
而不是文字字符串。这可以防止错误重构,并且更明确的实际意图。这当然是你不能使用更好的CallerMemberName
属性的地方【参考方案3】:
要加我的 2 美分,如果你想用你的 Control 的新值更新你的数据源,你需要调用 UpdateSource()
而不是 UpdateTarget()
:
((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();
【讨论】:
我更喜欢这个答案。【参考方案4】:MultiBinding 友好版本...
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
【讨论】:
【参考方案5】:尝试使用BindingExpression.UpdateTarget()
【讨论】:
【参考方案6】:我从后端获取数据并只用一行代码更新了屏幕。有效。不确定,为什么我们需要实现接口。 (Windows 10,UWP)
private void populateInCurrentScreen()
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
【讨论】:
This.Bindings.update() 刷新屏幕中的所有绑定。仅供参考 我在 UWP 的一个用户控件中尝试了 this.Bindings.Update() 并且它不存在。 是的。而且 this.Bindings 仍然不存在。 Bindings.Update() 仅在使用已编译绑定 (x:Bind) 的情况下可用...并且已编译绑定仅在 UWP 中可用 请看@MarianDolinský 评论。看起来你必须从 xaml 绑定以上是关于WPF 加载框的主要内容,如果未能解决你的问题,请参考以下文章