我的CommandBar
在XAML中将其IsOpen属性设置为true,因此每个按钮的文本都是可见的,因为我希望描述保持可见。
当我点击省略号按钮时,它会隐藏文字,第二次点击它时,我收到以下错误:
No installed components were detected. Cannot resolve TargetName HighContrastBorder
。
用户界面有些尴尬,也许与此相关,但我无法弄清楚是什么或为什么:
正如你可以看到我的按钮'我显示的各种按钮的文字被截止:
代码明智,据我所知,它并没有什么特别之处:
<Page.BottomAppBar>
<CommandBar IsOpen="True"
ClosedDisplayMode="Compact"
IsSticky="True"
Visibility="{Binding
CommandBarViewModel.IsCommandBarVisible,
Converter={StaticResource BoolToVisibilityConverter}}"
Background="{ThemeResource SystemControlBackgroundAccentBrush}">
<AppBarButton
Icon="Add"
Label="Add"
Foreground="White"
Command="{Binding CommandBarViewModel.AddCommand}"
Visibility="{Binding CommandBarViewModel.IsAddVisible,
Converter={StaticResource BoolToVisibilityConverter}}"/>
<AppBarButton
Icon="Refresh"
Label="Refresh"
Foreground="White"
Command="{Binding CommandBarViewModel.RefreshListCommand}"
Visibility="{Binding
CommandBarViewModel.IsRefreshListVisible,
Converter={StaticResource BoolToVisibilityConverter}}"/>
</CommandBar>
</Page.BottomAppBar>
没有InnerException,并且从App.g.i.cs
抛出异常#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached)
global::System.Diagnostics.Debugger.Break();
};
#endif
关于我的问题的任何想法,即文本截止和未处理的异常?
由于
更新 - 1:
当我从CommandBarViewModel.IsCommandBarVisible
的{{1}}属性中移除绑定属性(Visible
)并将其硬编码为CommandBar
时,错误会向下移动,而不是发生在App.gics中,现在它正在尝试设置可见性的第一个按钮的绑定属性,即
Visible
但这次我收到以下错误:
<AppBarButton
Icon="Add"
Label="Add"
Foreground="White"
Command="{Binding CommandBarViewModel.AddCommand}"
Visibility="{Binding CommandBarViewModel.IsAddVisible,
Converter={StaticResource BoolToVisibilityConverter}}"/>
类似于你可以看到,但它似乎来自MVVMLight ???没有意义!
有关如何解决此问题的任何建议/想法?
更新 - 2:
如果我删除所有Visibility属性(及其相应的绑定),则相应地显示命令(即没有更多的截止文本),我可以一遍又一遍地点击省略号按钮,它不再崩溃!
所以它与Visibility明确相关并将它绑定到视图模型的属性,但究竟是什么,我不知道。
可能是ViewModel仅在页面加载时构建,在此阶段,CommandBar和它的按钮被正确初始化为时已晚。
奇怪的是,关于显示/隐藏按钮的所有内容都按预期工作,除了我的文字被截断,我无法点击省略号按钮或它崩溃。
更新 - 3:
我发现了一个解决方法而且我没有跳起来,因为我认为这是错误的,但现在它会这样做。为了避免这个错误,我确保在初始化ViewModel时将命令栏和按钮设置为可见,然后根据它所在的页面相应地隐藏它们。
公共类AppShellViewModel { public void AppShellViewModel { this.CommandBarViewModel.IsCommandBarVisible = true; this.CommandBarViewModel.IsAddVisible = true; this.CommandBarViewModel.IsRefreshVisible = true; this.CommandBarViewModel.IsCancelVisible = true; }
An exception of type 'System.Runtime.InteropServices.COMException'
occurred in GalaSoft.MvvmLight.dll but was not handled in user code
WinRT information: Cannot resolve TargetName HighContrastBorder.
Additional information: No installed components were detected.
}
就我个人而言,我觉得它是CommandBar控件和按钮的一个错误,因为我应该能够从它开始隐藏它(和它的按钮)它应该
a)能够毫无错误地处理这个问题。 b)能够重绘&#34;本身是正确的,没有文字切断。
我当然可能错了,它可能与我的代码有关,但从我的角度来看,删除可见性绑定修复它并使其可见首先修复它,所以它似乎指向这种方式。 / p>
更新 - 4:
这是实际的代码。我尽可能地简化了它(即删除了名称空间,DataTemplates,Main内容等等),只留下了CommandBar及其按钮。希望这会有所帮助。
正如您在使用mvvmlight时所看到的,我的源设置为...
\\Hide buttons accordingly in the various parts of your app.
this.CommandBarViewModel.IsCancelVisible = false;
,我的路径设置为相关的Locator
,在本例中为AppShellViewModel。
然而正如Grace所解释的,当我使用x:bind而不是绑定时,我收到以下错误:
ViewModel
XAML代码:
Invalid binding path 'CommandBarViewModel.IsCommandBarVisible' :
Property 'CommandBarViewModel' can't be found on type 'AppShell'
MyApp ..\MyApp\Views\AppShell.xaml
感谢。
答案 0 :(得分:1)
我使用您的代码创建一个示例项目:
XAML:
<Page
x:Class="CommandBarSample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CommandBarSample"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="root">
</Grid>
<Page.BottomAppBar>
<CommandBar IsOpen="True"
IsSticky="True"
ClosedDisplayMode="Compact"
Background="{ThemeResource SystemControlBackgroundAccentBrush}">
<AppBarButton
Icon="Add"
Label="Add"
Foreground="White"
Command="{Binding CommandBarViewModel.RegisterCardCommand}"
/>
<AppBarButton
Icon="Refresh"
Label="Refresh"
Foreground="White"
Command="{Binding CommandBarViewModel.RefreshCardListCommand}"
/>
</CommandBar>
</Page.BottomAppBar>
</Page>
xaml.cs:
默认模板,不做任何改变。
我无法重现您的异常和UI错误,这是我的猜测:在项目的某个地方,您提到HighContrastBorder
作为样式的目标。我建议你在其他地方找到并修复它,你发布的代码正在运行。我的版本是14316桌面。
<强>更新强>
我将Visibility="{Binding ShowButton}"
添加到AppBarButton,将this.DataContext = this;
添加到xaml.cs的构造函数
在xaml.cs中添加以下内容:
private bool _ShowButton = true;
public bool ShowButton
{
get
{
return _ShowButton;
}
set
{
Set(ref _ShowButton, value);
}
}
private void Set(ref bool _ShowButton, bool value, [CallerMemberName] string property = "")
{
_ShowButton = value;
NotifyPropertyChanged(property);
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
当我更改ShowButton
值时,可见性会相应更新。
答案 1 :(得分:1)
没有InnerException,并且从App.g.i.cs
抛出异常
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached)
global::System.Diagnostics.Debugger.Break();
};
#endif
当代码运行时,Add
按钮或Refresh
按钮设置为不可见时,我可以重现此问题。
要解决此问题,您可以使用x:Bind
代替Binding
。 {x:Bind}执行它在编译时生成的专用代码,{Binding}使用通用运行时对象检查。
如果您首先向IsAddVisible
或IsRefreshListVisible
设置&#34; false&#34;(不可见),则不会生成匹配的AppbarButton
,错误将使用Binding
发生。例如,您使用x:Bind
设置为Refresh
按钮不可见且Add
按钮可见,您会发现Refresh
按钮中没有空格CommandBar
按钮1}},Add
按钮将取代它。这可以确认我的意见,如果您在false
初始化时将AppbarButton
设置为Commandbar
,则不会生成此按钮。
未检测到已安装的组件。无法解析TargetName HighContrastBorder
如果您选中template of CommandBar
,您会看到Rectangle
内有HighContrastBorder
名为CommandBar
的内容。
或者您可以在代码运行时使用Live Visual Tree查找此HighContrastBorder
:
如您所见,Rectangle
中的ContentRoot
为CommandBar
。
我无法重现这个问题,或者文字截止问题,它们在我身边总是很好。我使用MVVM,但我没有使用MVVMLight来测试问题。也许你可以分享你的样本。