我會很好的在VB或C#中的答案,我知道兩個,最終的解決方案將寫在VB.Net雖然。實質上,我想使用一個模板來重複使用n個排列中的基礎的從屬屬性,但是我使用的是代碼隱藏在路由後面的xaml,並放棄了一個Style模板。基本上我想要做的用戶控件這樣的事情我想用一個基地:如何從基本WPF用戶控件繼承從屬屬性到繼承的新用戶控件?
XAML:
<UserControl x:Class="Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFControls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Name="PART_TestLayout">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="{Binding TestTitle}" Height="30" Background="White" Foreground="Black" />
<TextBlock Name="PART_Text2" Grid.Row="1" Background="White" />
</Grid>
</UserControl>
代碼隱藏XAML的:
Imports System.ComponentModel
Public Class Test
Public Sub New()
InitializeComponent()
PART_TestLayout.DataContext = Me
End Sub
Public Shared ReadOnly TestTitleProperty As DependencyProperty = DependencyProperty.Register("TestTitle", GetType(String), GetType(Test), New UIPropertyMetadata(String.Empty, AddressOf TestChanged))
Public Property TestTitle As String
Get
Return CType(GetValue(TestTitleProperty), String)
End Get
Set
SetValue(TestTitleProperty, Value)
End Set
End Property
Private Shared Sub TestChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim m = DirectCast(d, Test)
m.PART_Text2.Text = $"Changed {DateTime.Now.ToLongTimeString}"
End Sub
Public MustOverride Sub DoThing()
End Class
我想做的是這樣的:
USE1:
<local:Test x:Class="TestInheritance"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFControls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Label Content="I am the first implentation"/>
<local:Test TestTitle="{Binding TestText}" />
</Grid>
</local:Test>
USE2
<local:Test x:Class="TestInheritance2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFControls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Label Content="I am the second implentation"/>
<local:Test TestTitle="{Binding TestText}" />
</Grid>
</local:Test>
現在我知道我可以做這樣的事情(可能是我應該去的方式)
<UserControl x:Class="TestInheritance"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFControls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<local:Part1 TestTitle="{Binding TestText}" />
<!-- myproprietaryContent -->
<local:Part2 TestLegend="{Binding TestText2}" />
</Grid>
</local:Test>
但我寧願只是從一個基礎模板繼承,只是申請我需要的一切。 我是否需要使用樣式模板來做到這一點,或者我可以重複使用XAML UserControl嗎?每當我背後我得到這個錯誤做「繼承(baseclassname)」中的代碼:
'Base class 'Test' specified for class 'TestInheritance' cannot be different from the base class 'UserControl' of one of its other partial types.'
所以,我有種被卡住劃傷,不知道夠不上語言和WPF的能力,我的頭這可以要做,或者應該爲此做。
基類不應該有任何內容或XAML文件,因爲這將由派生的UserControl實例重寫。你想在派生控件中使用「PART_TestLayout」網格嗎? – mm8
大多數情況下繪圖是在後面的代碼中完成的,但我仍然綁定傳統MVVM體系結構中的數據元素。我想重複使用通用的依賴屬性,而不是如何挑剔。我只是不想爲不同的迭代設置2,3或4次。 – djangojazz
@ mm8用XAML用戶控件繼承任何東西,必須有更多的繼承。每次我嘗試時,我總是得到:''Test'類指定的基類'BaseTest'不能與其他部分類型的基類'UserControl'不同。'。我可以讓它繼承'UserControl'本身或不是,把這個
djangojazz