升级 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,您不能从 Window
和 Behavior
等多个 类 派生。
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 元素和行为派生是没有意义的。
我更新了 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,您不能从 Window
和 Behavior
等多个 类 派生。
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 元素和行为派生是没有意义的。