【问题标题】:Upgrading XAML Behaviors升级 XAML 行为
【发布时间】:2022-01-16 21:34:39
【问题描述】:

我已更新 PRISM,现在我的 XAML 文件返回错误。 我已经对如何修复它进行了一些研究,似乎更改 xmlns:i 标记就可以了。

原来是这样的:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

我把它改成了:

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

现在的问题是我在 Class 标签上遇到错误:

<Window x:Class="X.StatusHostWindow">

我得到的错误是:

无法将指定的值分配给集合。应为以下类型:“行为”

我的类后面的代码继承了类Window,所以如果我想继承类Behavior,它抱怨我不能有多重继承。

知道如何解决这个问题吗?

XAML 代码:

<Window x:Class="X.StatusHostWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:po="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:TemplateSelectors="clr-namespace:X.TemplateSelectors"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:local="clr-namespace:X.Client.Controls"
    xmlns:Shared="clr-namespace:X.Common.Shared;assembly=X"
    xmlns:converters="clr-namespace:X.Client.Controls.Convertors"
    xmlns:Behaviors="clr-namespace:X.Client.Controls.Behaviors" ShowActivated="False" 
    AllowsTransparency="True"
    WindowStyle="None"
    ShowInTaskbar="False"
    Background="Transparent" 
    Topmost="True" 
    UseLayoutRounding="True"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
<Window x:Class="X.Client.Controls.StatusHostWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:po="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:TemplateSelectors="clr-namespace:X.Client.Controls.TemplateSelectors"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:local="clr-namespace:X.Client.Controls"
    xmlns:Shared="clr-namespace:X.Common.Shared;assembly=X.Common.Infrastructure"
    xmlns:converters="clr-namespace:X.Client.Controls.Convertors"
    xmlns:Behaviors="clr-namespace:X.Client.Controls.Behaviors" ShowActivated="False" 
    AllowsTransparency="True"
    WindowStyle="None"
    ShowInTaskbar="False"
    Background="Transparent" 
    Topmost="True" 
    UseLayoutRounding="True"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
<Window.Resources>
    <converters:SeverityToBrushConverter x:Key="severityToBrushConverter"/>

    <local:TriggersCollection x:Key="removeTriggers" x:Shared="false">
        <i:EventTrigger EventName="MouseLeftButtonDown">
            <i:InvokeCommandAction Command="{Binding RemoveStatusCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
                                   CommandParameter="{Binding}"
                                   />
        </i:EventTrigger>
    </local:TriggersCollection>

&lt;i:EventTrigger&gt; 标签出现错误:

命名空间http://schemas.microsoft.com/expression/2010/interactivity中不存在名称eventTrigger。

这就是为什么我将其更新为:

xmlns:i="http://schemas.microsoft.com/xaml/behaviors

【问题讨论】:

  • 能否请您显示代码,错误发生在哪里?你能澄清一下继承的问题是什么吗?你有一个窗口,但你从Behavior派生?这似乎不对。
  • @thatguy 我已经更新了原帖

标签: c# wpf xaml prism


【解决方案1】:

在您的 XAML 中,您没有使用正确的命名空间。以下两个命名空间都来自您要替换的旧交互库。

  • xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
  • xmlns:ei=http://schemas.microsoft.com/expression/2010/interactions"(在您的示例中未使用)

用新的 XAML 行为命名空间替换它们。

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

您的代码隐藏中的错误来自这样一个事实,即 C# 仅支持 single inheritance,您不能从多个类派生,例如 WindowBehavior

类类型支持单继承和多态,派生类可以扩展和专门化基类的机制。

这与行为或升级无关,以前也不可能。行为的目的是创建可重用的组件,这些组件封装了可以附加到 UI 元素的特定行为。通常,您使用 i:Interaction.Behaviors 元素在 XAML 中附加一个行为,例如:

<TextBox>
    <i:Interaction.Behaviors>
        <local:MySpecialHighlightingBehavior/>
    </i:Interaction.Behaviors>
</TextBox>

因此,同时从 UI 元素和行为派生是没有意义的。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多