【发布时间】:2017-06-16 12:32:19
【问题描述】:
我有一个带有 ListBox 的 UWP C# 应用程序。我将 ListBox ItemContainerStyle 属性设置为资源中的样式。我试图在样式中向 ControlTemplate 添加一个按钮。我不知道在哪里添加 Clicked 或 tapped 事件处理程序。
我将代码转换为使用直接添加到列表中的 UserControl,它工作得很好,只是 VisualStateManager 在 UserControl 中不起作用。
所以我可以获得一个带有 UserControl 代码隐藏的功能按钮,我可以让 VisualStateManager 工作并处理我的 ListBoxItem 选择的自定义可视化,但我无法获得视觉状态以及功能按钮。
我不确定这里要显示什么代码,因为就像我说的那样,除了按钮之外的所有内容都可以与样式一起正常工作,并且除了视觉状态处理之外,所有内容都可以与用户控件一起正常工作。
我已经阅读了我能找到的所有关于这个的问题,我能找到的最接近的方法是为按钮提供一个处理函数,但没有人说要将它添加到哪个类;他们只是在任何情况下单独显示功能。视觉状态处理似乎总是需要开发人员检测鼠标悬停、选择等...,在代码中处理状态,每个状态都有一个处理程序来检测,然后调用 GoToState 来让视觉状态管理器去做它的东西。必须有一种方法可以做到这一点,而无需所有这些旋转和额外且看似冗余的代码。
[更新]
我目前正在通过设置 ItemContainerStyle 为 ListBoxItem 使用样式。此外,我正在尝试绑定新添加的 Button 的 Command 参数。它不起作用。这是该样式的 XAML,只显示了重要部分(因为除了按钮之外,它都按预期工作)。这显示了两个文本框和按钮。重要的是要注意 TextBox 元素的 Text 属性的绑定工作正常,并且文本完全按预期显示。这让我想假设绑定源和路径的东西都设置正确。但是再一次,我被挫败了,因为 Command 绑定不起作用,并且在构建或运行时没有报告错误:
<StackPanel Background="Transparent" Margin="0,0,0,0">
<TextBlock FontSize="22" TextWrapping="Wrap" FontWeight="SemiLight" x:Name="Title" Text="{Binding Title}" Margin="12,4,24,6" Visibility="{Binding Title, Converter={StaticResource StringToVisibiltyConverter}}" Foreground="{Binding color}"/>
<TextBlock TextWrapping="Wrap" Visibility="{Binding SubTitle, Converter={StaticResource StringToVisibiltyConverter}}" x:Name="Subtitle" Text="{Binding SubTitle}" Margin="12,-6,24,6" Opacity="0.8" Foreground="{Binding color}"/>
<Button Command="{Binding ClickCommand}" CommandParameter="x">X</Button>
</StackPanel>
这是我添加到 ListBox 的对象的代码:
public class MultilineListboxItem : Object
{
public MultilineListboxItem() { ClickCommand = new _ClickCommand(); }
public string Title { get; set; }
public string SubTitle { get; set; }
public string Original { get; set; }
public override string ToString() { return Original; }
public SolidColorBrush color { get; set; }
_ClickCommand ClickCommand;
}
当然还有 _ClickCommand 类定义:
public class _ClickCommand : ICommand
{
public void Execute(object parameter)
{
Diagnostics.AppendDiagnostic( "derf" );
}
public bool CanExecute(object parameter)
{
Diagnostics.AppendDiagnostic( "derf" );
return true;
}
public event EventHandler CanExecuteChanged;
}
这些是我自己的诊断报告函数,不是 C# 或 WinRT 中的。
现在我又回到了使用样式来定义列表项的外观,视觉状态都按预期工作。
【问题讨论】:
标签: c# xaml windows-runtime