C# 如何在命令栏中动态更改图像的源?

C# 如何在命令栏中动态更改图像的源?,c#,mvvm,uwp,commandbar,C#,Mvvm,Uwp,Commandbar,在通过互联网深度搜索了一天之后,我试着直接问你 我用C#编写了一个Windows10UWP应用程序。我想展示一下wifi连接的强度。我有几张图片来展示这一点。wifi强度应显示在顶部应用程序栏中 我使用MVVM设置图像源。它可以很好地用于UserControl中的图像,但我无法在命令栏中显示该图像 我有一个事件,它为我提供了实际图像的Uri(“图片”) private void WiFiInformationUpdated(object sender, WiFiInformationEv

在通过互联网深度搜索了一天之后,我试着直接问你

我用C#编写了一个Windows10UWP应用程序。我想展示一下wifi连接的强度。我有几张图片来展示这一点。wifi强度应显示在顶部应用程序栏中

我使用MVVM设置图像源。它可以很好地用于UserControl中的图像,但我无法在命令栏中显示该图像

我有一个事件,它为我提供了实际图像的Uri(“图片”)

    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()
或使布局无效?没有,但是。。。我自己找到了解决办法:-)