我完全無法將影像系結到我的自定義 WPF 擴展器。
我在這里找到了一個用于創建擴展器模板的示例:https ://www.codeproject.com/Articles/248112/Templating-WPF-Expander-Control并嘗試對其進行編輯以使用影像而不是擴展器圖示。
這是我的擴展按鈕自定義模板(我在這里添加了一個影像源,因此它可以與直接資源路徑一起正常作業,而不是系結):
<ControlTemplate x:Key="SimpleExpanderButtonTemp"
TargetType="{x:Type ToggleButton}">
<Border x:Name="ExpanderButtonBorder"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image
Height="35"
Width="35"
Source="{Binding Path = ImageSource,
RelativeSource={RelativeSource TemplatedParent}}">
</Image>
<ContentPresenter x:Name="HeaderContent"
Grid.Column="1"
Margin="4,0,0,0"
ContentSource="Content"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<!-- MouseOver, Pressed behaviours-->
<Trigger Property="IsMouseOver"
Value="true">
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
之后,我將模板添加到擴展器本身:
<ControlTemplate x:Key="SidePanelExpander" TargetType="Expander">
<DockPanel>
<ToggleButton x:Name="ExpanderButton"
DockPanel.Dock="Top"
ImageSource="{Binding Path = ImageSource,
RelativeSource={RelativeSource TemplatedParent}}"
Template="{StaticResource SimpleExpanderButtonTemp}"
Content="{TemplateBinding Header}"
IsChecked="{Binding Path=IsExpanded,
RelativeSource={RelativeSource TemplatedParent}}"
OverridesDefaultStyle="True"
Padding="1.5,0">
</ToggleButton>
<ContentPresenter x:Name="ExpanderContent"
Visibility="Collapsed"
DockPanel.Dock="Bottom"/>
</DockPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter TargetName="ExpanderContent"
Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
然后我嘗試以這種方式使用它:
<Expander ExpandDirection="Right"
Template="{StaticResource SidePanelExpander}"
ImageSource="../Res/Images/engine.png"
>
我想通過模板進行資料系結轉發有一些困難,但不知道如何解決這個問題。
uj5u.com熱心網友回復:
正如克萊門斯在評論中所說,ToggleButton并且Expander沒有名為 ImageSource 的屬性,所以這段代碼永遠不會作業。執行此操作的“正確”方法是創建自定義控制元件,但快速修復(hack)是使用 Tag 屬性指定影像路徑:
在“SimpleExpanderButtonTemp”模板中,更改Image元素Source,如下所示:
<Image Height="35"
Width="35"
Source="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}" />
接下來,在 "SidePanelExpander" 模板 ToggleButton 中,去掉 "ImageSource=..." 行并將其替換為:
Tag="{TemplateBinding Tag}"
最后,在控制元件本身中,指定您的影像:
<Expander Tag="../Res/Images/engine.png"
...
此外,在第一個模板中,我注意到您在Border控制元件的某些屬性(Background、BorderBrush、BorderThickness)上使用了 TemplateBindings。這些也行不通。要解決此問題,請將這些相同的行復制到ToggleButton第二個模板的控制元件,即
<ToggleButton x:Name="ExpanderButton"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
...
您現在可以在控制元件本身中指定(例如)背景顏色:
<Expander Background="Blue"
...
ToggleButton 上的 TemplateBindings 就像墊腳石,允許屬性值從控制元件本身傳遞到 ToggleButton,然后傳遞到 Border。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/481280.html
