升级 XAML 行为

Upgrading XAML Behaviors

我更新了 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">

我得到的错误是:

The specified value cannot be assigned to the collection. The following type was expected: "Behavior".

我在 class 后面的代码继承了 class Window,所以如果我想继承 class 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>

我在 <i:EventTrigger> 标签上遇到错误:

The name eventTrigger does not exist in the namespace http://schemas.microsoft.com/expression/2010/interactivity.

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

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

在您的 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 等多个 类 派生。

Class types support single inheritance and polymorphism, mechanisms whereby derived classes can extend and specialize base classes.

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

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

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