【问题标题】:Button inside button (WPF + Caliburn.Micro)按钮内按钮(WPF + Caliburn.Micro)
【发布时间】:2017-07-05 13:51:25
【问题描述】:

在常规 WPF 中,您可以在另一个按钮中包含一个按钮,并且为了防止在单击内部按钮时引发两个按钮事件,您可以使用以下 XAML(根据 this question):

<Button Click="OuterClick">
    <Grid>
        <SomeOtherContent />
        <Button Click="InnerClick" />
    </Grid>
</Button>

然后在代码隐藏中使用事件的 Handled 属性,以便在单击内部按钮时不会引发 OuterClick:

private void OuterClick(object sender, RoutedEventArgs e) {
    // Do something
}
private void InnerClick(object sender, RoutedEventArgs e) {
    // Do something else
    e.Handled = true;
}

但是,按照通常的 Caliburn.Micro 约定,您将拥有以下 XAML:

<Button x:Name="OuterClick">
    <Grid>
        <SomeOtherContent />
        <Button x:Name="InnerClick" />
    </Grid>
</Button>

在 ViewModel 中有这个:

private void OuterClick() {
    // Do something
}
private void InnerClick() {
    // Do something else
}

如何确保在单击 InnerButton 时不会同时引发 InnerClick()OuterClick()

编辑:或者,我可以使用什么其他类型的控件?

【问题讨论】:

  • 嵌套按钮?这是什么废话。我怀疑你会让维护 caliburn 的人适应这种情况,因为这种情况有一天会在 thedailywtf.com 上发布......
  • @Sinatr 不要跳过“
  • 我的&lt;SomeOtherContent&gt; 和内部按钮周围还有什么其他组件可以将点击事件附加到最外面的元素?我需要一个包含元素的列表,并且我需要能够单击一个元素,但我还必须能够单击元素内的按钮(不单击元素本身)?
  • @GTHvidsten 我个人不会使用 caliburn 来解决这个要求。我以前也用过,但只有使用基本场景才简单。如果我是你,我会使用 AttachedProperties,它使用预览事件来触发命令。虽然 caliburn 让一些事情变得更容易,但它确实让一些事情变得更加困难 - 就像这样
  • 我建议您简单地更改布局:将内部按钮定义在同一级别并重叠外部。

标签: c# wpf mvvm caliburn.micro


【解决方案1】:
<StackPanel cal:Message.Attach="[Event MouseDown]=[Action OuterClick()]">
    <StackPanel Orientation="Horizontal">
        <SomeotherContent />
        <Button x:Name="InnerClick" />
    </StackPanel>
</StackPanel>

在您的视图模型中

public void OuterClick()
{
    //Do something
}
public void InnerClick()
{
    //Do something
}

使用 stackpanel 并为其应用事件。

这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多