C# 如何在命令栏中动态更改图像的源?
在通过互联网深度搜索了一天之后,我试着直接问你 我用C#编写了一个Windows10UWP应用程序。我想展示一下wifi连接的强度。我有几张图片来展示这一点。wifi强度应显示在顶部应用程序栏中 我使用MVVM设置图像源。它可以很好地用于UserControl中的图像,但我无法在命令栏中显示该图像 我有一个事件,它为我提供了实际图像的Uri(“图片”)C# 如何在命令栏中动态更改图像的源?,c#,mvvm,uwp,commandbar,C#,Mvvm,Uwp,Commandbar,在通过互联网深度搜索了一天之后,我试着直接问你 我用C#编写了一个Windows10UWP应用程序。我想展示一下wifi连接的强度。我有几张图片来展示这一点。wifi强度应显示在顶部应用程序栏中 我使用MVVM设置图像源。它可以很好地用于UserControl中的图像,但我无法在命令栏中显示该图像 我有一个事件,它为我提供了实际图像的Uri(“图片”) private void WiFiInformationUpdated(object sender, WiFiInformationEv
private void WiFiInformationUpdated(object sender, WiFiInformationEventArgs args)
{
if (args.SSID != _viewModel.WifiInformationData.SSID)
{
_viewModel.WifiInformationData.SSID = args.SSID;
}
if (args.SignalBars != _viewModel.WifiInformationData.SignalBars)
{
_viewModel.WifiInformationData.SignalBars = args.SignalBars;
}
if(args.Picture != null)
{
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() =>
{
var pic = new BitmapImage(args.Picture);
_viewModel.WifiInformationData.Picture = pic;
}
);
}
}
这就是它在UserControl中工作良好的地方:
<UserControl.DataContext>
<Binding Path="Main" Source="{StaticResource Locator}"/>
</UserControl.DataContext>
<Image Source="{Binding WifiInformationData.Picture}" Grid.Row="1" Grid.Column="2" DataContextChanged="Image_DataContextChanged"/>
这是一个有问题的场景:
<Page.DataContext>
<Binding Path="Main" Source="{StaticResource Locator}"/>
</Page.DataContext>
<Page.TopAppBar>
<CommandBar HorizontalContentAlignment="Center" IsOpen="True" IsSticky="True" CompositeMode="Inherit">
<CommandBar.ContentTemplate>
<DataTemplate>
<RelativePanel VerticalAlignment="Stretch" Width="200" >
<Image Source="{Binding Main.WifiInformationData.Picture, Source={StaticResource Locator}}" Width="20" RelativePanel.Below="tbPercentWifi" DataContextChanged="Image_DataContextChanged"/>
</RelativePanel>
</DataTemplate>
</CommandBar.ContentTemplate>
</CommandBar>
</Page.TopAppBar>
有什么建议吗?解决方案是:
数据模板访问问题。。。固定人:
public static class DataTemplateObjects
{
public static DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
{
int childNumber = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i < childNumber; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(control, i);
FrameworkElement fe = child as FrameworkElement;
// Not a framework element or is null
if (fe == null) return null;
if (child is T && fe.Name == ctrlName)
{
// Found the control so return
return child;
}
else
{
// Not found it - search children
DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
if (nextLevel != null)
return nextLevel;
}
}
return null;
}
}
公共静态类DataTemplateObjects
{
公共静态DependencyObject FindChildControl(DependencyObject控件,字符串ctrlName)
{
int childNumber=VisualTreeHelper.GetChildrenCount(控件);
for(int i=0;i
然后在我的事件中设置图像的源:
private void WiFiInformationUpdated(object sender, WiFiInformationEventArgs args)
{
if (args.SSID != _viewModel.WifiInformationData.SSID)
{
_viewModel.WifiInformationData.SSID = args.SSID;
}
if (args.SignalBars != _viewModel.WifiInformationData.SignalBars)
{
_viewModel.WifiInformationData.SignalBars = args.SignalBars;
}
if(args.Picture != null)
{
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() =>
{
var pic = new BitmapImage(args.Picture);
_viewModel.WifiInformationData.Picture = pic;
Image img = DataTemplateObjects.FindChildControl<Image>(commandBar, "imgWifi") as Image;
if (img == null) return;
img.Source = pic;
});
}
}
private void WiFiInformationUpdated(对象发送方,WiFiInformationEventArgs args)
{
if(args.SSID!=\u viewModel.WifiInformationData.SSID)
{
_viewModel.WifiInformationData.SSID=args.SSID;
}
if(args.SignalBars!=\u viewModel.WifiInformationData.SignalBars)
{
_viewModel.WifiInformationData.SignalBars=args.SignalBars;
}
如果(args.Picture!=null)
{
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,()=>
{
var pic=新的位图图像(args.Picture);
_viewModel.WifiInformationData.Picture=pic;
Image img=DataTemplateObjects.FindChildControl(commandBar,“imgWifi”)作为映像;
if(img==null)返回;
img.Source=pic;
});
}
}
您是否尝试过UpdateLayout()
或使布局无效?没有,但是。。。我自己找到了解决办法:-)