winui3について、NavigationViewのペイン部とコンテンツ部の間にある線を非表示にしたい

惇人 矢川 20 評価のポイント
2024-08-21T07:14:38.18+00:00

Windows11 23H2、Visual Stadio2022です。

<Grid>
	<NavigationView x:Name="NV" PaneDisplayMode="Left">
		<Frame x:Name="ContentFrame"/>
	</NavigationView>
</Grid>

のようにナビゲーションビューを作成した際、ペイン部とコンテンツ部を区切る為の線がデフォルトで引かれますが、これを非表示とすることはできないのでしょうか。

イメージとしてはWindows11の設定アプリのように左側の目次と右側のコンテンツに境界がないようにしたいです。

FrameのBorderThicknessを0としても表示されたままで、NavigationViewに対応してそうなパラメータも見つからず困っています。

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
81 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 9,421 評価のポイント MVP
    2024-08-21T08:53:26.03+00:00

    こんな

    private void NV_Loaded(object sender, RoutedEventArgs e)
    {
        var nv = (NavigationView)sender;
    
        var root = FindChildren<Grid>(nv).Where(_ => _.Name == "RootGrid").FirstOrDefault();
        if (root != null)
        {
            if (root.FindName("ContentGrid") is Grid grid)
            {
                grid.BorderThickness = new Thickness(0, 0, 0, 0);
                grid.BorderBrush = null;
                grid.CornerRadius = new CornerRadius(0);
    
                //grid.BorderThickness = new Thickness(5, 0, 0, 0);                    
                //grid.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 255, 0, 0));
                //grid.CornerRadius = new CornerRadius(0);
            }
        }
    
    }
    
    private IEnumerable<T> FindChildren<T>(DependencyObject d) where T : DependencyObject
    {
        int count = VisualTreeHelper.GetChildrenCount(d);
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(d, i);
            if (child is T t)
            {
                yield return t;
            }
            foreach (var grandchild in FindChildren<T>(child))
            {
                yield return grandchild;
            }
        }
    }
    

    あるいは

    private void ContentFrame_Loaded(object sender, RoutedEventArgs e)
    {
        Frame f = (Frame)sender;
        DependencyObject d = f;
        while (d != null)
        {
            if (d is Grid grid && grid.Name == "ContentGrid")
            {
                grid.BorderThickness = new Thickness(5, 0, 0, 0);
                grid.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 0,255, 0));
                grid.CornerRadius = new CornerRadius(0);
                break;
            }
            d = VisualTreeHelper.GetParent(d);
        }
    }
    

    NavigationViewのテンプレートは"C:\Users[ユーザー名].nuget\packages\microsoft.windowsappsdk[WinUIのバージョン]\lib[ランライムのバージョン]\Microsoft.WinUI\Themes\generic.xaml"にあるので <ControlTemplate TargetType="controls:NavigationView">で探してください。

    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。