2017-03-03 7 views
0

インターネットの深さから1日を検索した後、私はあなたに直接お尋ねします。CommandBar内でイメージのソースを動的に変更するにはどうすればよいですか?

私はWindows 10 UWP AppをC#で作成しました。私は無線LAN接続の強さを見せたいと思います。私はこれを示すいくつかの画像を持っています。 Wi-Fiの強さはTopAppBarに表示する必要があります。

MVVMを使用してイメージソースを設定しました。それはUserControl内のイメージのために正常に動作しますが、CommandBarにイメージを表示することができません。

実際の画像のウリ(「画像」)を私に与えるイベントがあります。

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.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> 

何か提案してください?

+0

あなたは 'みましたUpdateLayout() 'を呼び出すか、Layoutを無効にしますか? –

+0

私はしませんでしたが、...私は自分自身で解決策を見つけました:-) –

答えて

0

ソリューションです:

DataTemplateのアクセスの問題...で固定:

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; 
    } 
} 

、その後、私のイベントで画像のソースを設定します。

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; 
      }); 
     } 
    } 
関連する問題