Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
128 件の質問
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
xamlにてこのように定義して
<BreadcrumbBar x:Name="BreadcrumbBar" ItemsSource="{x:Bind Items}">
<BreadcrumbBar.ItemTemplate>
<DataTemplate x:DataType="local:Item">
<TextBlock FontSize="20" Text="{x:Bind Text}"/>
</DataTemplate>
</BreadcrumbBar.ItemTemplate>
</BreadcrumbBar>
namespace winui3base
{
public record Item(string Text);
public sealed partial class MainWindow : Window
{
public List<Item> Items = new();
public MainWindow()
{
this.InitializeComponent();
Items.Add(new Item(Text: "あいうえおかきくけこさしすせそあいうえおかきくけこさしすせそ"));
Items.Add(new Item(Text: "あいうえおかきくけこさしすせそあいうえおかきくけこさしすせそ"));
Items.Add(new Item(Text: "あいうえおかきくけこさしすせそあいうえおかきくけこさしすせそ"));
}
}
}
適当な長い文字を表示するとします。
この時、ウィンドウ幅を狭めていくとパンくずリストのうち表示できない文字が省略されていきます。
省略された文字「...」を押した時に表示されるフライアウトについて、文字数が多いと横スクロール用のバーが表示されるのですが、そのバーをドラッグしても何も動きません。左右端の矢印ボタンをクリックしても動きません。キーボード操作もダメでした。
この動かないスクロールバーは何なのでしょうか。
これを動作するようにする方法を教えていただきたいです。
現状、動かないとスクロールバーが邪魔なので暫定回避策として以下のように400px以下(フライアウトに謎の横スクロールバーが表示されない幅)で文字列を表示してツールチップで全文字表示させています。
<TextBlock FontSize="20" Text="{x:Bind Text}" TextTrimming="CharacterEllipsis" ToolTipService.ToolTip="{x:Bind Text}" MaxWidth="400"/>
フライアウトを無理やり掘り出して、フライアウト内のScrollBarのHorizontalScrollModeをEnabledにしたら動作するようになりました。
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="CSWinUI3x.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CSWinUI3x"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="CSWinUI3x">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<BreadcrumbBar x:Name="BreadcrumbBar" ItemsSource="{x:Bind Items}">
<BreadcrumbBar.Resources>
<!-- Flyoutのテンプレート入れ替え用 -->
<ControlTemplate x:Key="flyoutTempalte" TargetType="FlyoutPresenter">
<Grid Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding CornerRadius}" BackgroundSizing="InnerBorderEdge">
<ScrollViewer x:Name="FlyoutPresenterScrollViewer"
AutomationProperties.AccessibilityView="Raw"
Margin="{TemplateBinding Padding}"
HorizontalScrollMode="Enabled"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
Content="{TemplateBinding Content}"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}" />
<Border x:Name="FlyoutPresenterBorder"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}" />
</Grid>
</ControlTemplate>
</BreadcrumbBar.Resources>
<BreadcrumbBar.ItemTemplate>
<DataTemplate x:DataType="local:Item">
<TextBlock FontSize="20" Text="{x:Bind Text}" Foreground="red"
Loaded="TextBlock_Loaded"
TextTrimming="CharacterEllipsis" />
</DataTemplate>
</BreadcrumbBar.ItemTemplate>
</BreadcrumbBar>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
namespace CSWinUI3x
{
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
for (int i = 0; i < 100; i++)
{
Items.Add(new Item(Text:i.ToString()+ " あいうえおかきくけこさしすせそあいうえおかきくけこさしすせそ"));
}
}
public List<Item> Items = new();
private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
if (this.tool != null)
{
return;
}
// BreadcrumbBarからFlyoutを掘り出す
this.tool = BreadcrumbFlyoutTool.TryGet(this.BreadcrumbBar, (DependencyObject)sender);
if (this.tool != null
&& this.BreadcrumbBar.Resources.TryGetValue("flyoutTempalte", out var o)
&& o is ControlTemplate template)
{
//Flyoutのテンプレートを入れ替え
tool.ReplaceTemplate(template);
}
}
private BreadcrumbFlyoutTool? tool = null;
}
public record Item(string Text);
class BreadcrumbFlyoutTool
{
/// <summary>Flyoutを掘り出す</summary>
public static BreadcrumbFlyoutTool? TryGet(BreadcrumbBar bar, DependencyObject barItem)
{
DependencyObject d = barItem;
while (d != null)
{
d = VisualTreeHelper.GetParent(d);
if (d is Microsoft.UI.Xaml.Controls.BreadcrumbBarItem baritem)
{
baritem.Background = new SolidColorBrush(Windows.UI.Color.FromArgb(0xff, 0xff, 0, 0));
if (VisualTreeHelper.GetParent(baritem) is ItemsRepeater ir)
{
if (VisualTreeHelper.GetChild(ir, 0) is BreadcrumbBarItem forEllipsis)
{
//xtemp.barItem = forEllipsis;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(forEllipsis); i++)
{
if (VisualTreeHelper.GetChild(forEllipsis, i) is Grid grid
&& grid.Name == "PART_LayoutRoot")
{
if (grid.Resources.TryGetValue("PART_EllipsisFlyout", out var o))
{
if (o is Microsoft.UI.Xaml.Controls.Flyout flyout)
{
var x = new BreadcrumbFlyoutTool(bar, ir, forEllipsis, flyout);
return x;
}
}
}
}
}
}
break;
}
}
return null;
}
private BreadcrumbFlyoutTool(BreadcrumbBar breadcrumbBar, ItemsRepeater ir, BreadcrumbBarItem barItem, Flyout flyout)
{
this.ir = ir;
this.barItem = barItem;
this.breadcrumbBar = breadcrumbBar;
this.flyout = flyout;
this.defaultStyle = flyout.FlyoutPresenterStyle;
//this.flyout.Closing += (s, e) => e.Cancel = true;
}
public readonly BreadcrumbBar breadcrumbBar;
public readonly ItemsRepeater ir;
public readonly BreadcrumbBarItem barItem;
public readonly Microsoft.UI.Xaml.Controls.Flyout flyout;
public readonly Style defaultStyle;
public void ReplaceTemplate(ControlTemplate template, double? width=null)
{
var s = new Style(defaultStyle.TargetType);
s.BasedOn = defaultStyle;
s.Setters.Add(new Setter(FlyoutPresenter.TemplateProperty, template));
if (width != null)
{
s.Setters.Add(new Setter(FlyoutPresenter.MinWidthProperty, width));
s.Setters.Add(new Setter(FlyoutPresenter.MaxWidthProperty, width));
s.Setters.Add(new Setter(FlyoutPresenter.WidthProperty, width));
}
flyout.FlyoutPresenterStyle = s;
}
}
}
# テンプレートは".nuget\packages\microsoft.windowsappsdk\1.6.250205002\lib\net6.0-windows10.0.18362.0\Microsoft.WinUI\Themes\generic.xaml"を参考に