[英]Generic.xaml doesn't use SystemParameters set in App.xaml
為了自定義ScrollBar
的外觀,我設置了這些:
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">15</sys:Double>
<sys:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">15</sys:Double>
在App.xaml
和Themes\Generic.xaml
Generic.xaml 中,我的一些自定義控件的Grid.Column
定義如下:
<ColumnDefinition Width="{Binding Source={x:Static SystemParameters.VerticalScrollBarWidth}}"/>
看起來我的自定義控件實際上不使用15
作為Width
。 有沒有辦法強制在Themes\Generic.xaml
Generic.xaml 中定義的自定義控件 Styles 使用App.xaml
中設置的這些值?
這是我現在在App.xaml
中的內容:
<Application x:Class="RentManager.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RentManager"
xmlns:sys="clr-namespace:System;assembly=System.Runtime"
xmlns:cc="clr-namespace:RentManager.CustomControl"
xmlns:con="clr-namespace:RentManager.Common"
StartupUri="Main.xaml">
<Application.Resources>
<ResourceDictionary>
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">12</sys:Double>
<sys:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">12</sys:Double>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/RentManager;component/Themes/Generic.xaml" />
<ResourceDictionary Source="pack://application:,,,/RentManager;component/Themes/OtherStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
當滾動條出現時,我遇到問題的 userControl 如下所示:
查看Receivable/Payment
列中的錯位。 這是沒有滾動條的樣子:
Ledger 的自定義控件是:
<Style TargetType="{x:Type local:Ledger}">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Ledger}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="{Binding Source={x:Static SystemParameters.VerticalScrollBarWidth}}"/>
</Grid.ColumnDefinitions>
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="Grid.Row" Value="1"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Grid.Resources>
<Border Grid.Row="1" Grid.ColumnSpan="5" Background="AliceBlue"/>
<Separator Grid.Row="0" Grid.ColumnSpan="5"/>
<TextBlock Text="Date" Margin="20 0 0 0"/>
<TextBlock Grid.Column="1" Text="Particulars"/>
<TextBlock Grid.Column="2" HorizontalAlignment="Right">
<Run Text="Receivable"/>
<LineBreak/>
<Run Text="/ Payment"/>
</TextBlock>
<TextBlock Grid.Column="3" HorizontalAlignment="Right" Text="Receipt"/>
<TextBlock Grid.Column="4" HorizontalAlignment="Right" Text="Balance" Margin="0 0 20 0"/>
<Separator Grid.Row="2" Grid.ColumnSpan="5"/>
</Grid>
<ItemsControl Grid.Row="1"
ItemsSource="{TemplateBinding Source}"
HorizontalContentAlignment="Stretch"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
ScrollViewer.CanContentScroll="True">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer VerticalScrollBarVisibility="Auto" x:Name="scroll">
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid >
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Date, StringFormat='dd MMM yyyy'}" Margin="20 0 0 0"/>
<ContentControl Grid.Column="1">
<ContentControl.Style>
<Style BasedOn="{StaticResource {x:Type ContentControl}}" TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.SelectedTab.Type, RelativeSource={RelativeSource AncestorType={x:Type local:Ledger}}}" Value="Plot">
<Setter Property="Content">
<Setter.Value>
<TextBlock TextWrapping="Wrap">
<Run Text="{Binding SpaceName}"/>
<Run Text=": "/>
<Run Text="{Binding TenantName}"/>
<Run Text=" - "/>
<Run Text="{Binding HeadName}"/>
<Run Text=" | "/>
<Run Text="{Binding Narration}" FontStyle="Italic" Foreground="Blue"/>
</TextBlock>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.SelectedTab.Type, RelativeSource={RelativeSource AncestorType={x:Type local:Ledger}}}" Value="Space">
<Setter Property="Content">
<Setter.Value>
<TextBlock TextWrapping="Wrap">
<Run Text="{Binding PlotName}"/>
<Run Text=": "/>
<Run Text="{Binding TenantName}"/>
<Run Text=" - "/>
<Run Text="{Binding HeadName}"/>
<Run Text=" | "/>
<Run Text="{Binding Narration}" FontStyle="Italic" Foreground="Blue"/>
</TextBlock>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.SelectedTab.Type, RelativeSource={RelativeSource AncestorType={x:Type local:Ledger}}}" Value="Tenant">
<Setter Property="Content">
<Setter.Value>
<TextBlock TextWrapping="Wrap">
<Run Text="{Binding PlotName}"/>
<Run Text=": "/>
<Run Text="{Binding SpaceName}"/>
<Run Text=" - "/>
<Run Text="{Binding HeadName}"/>
<Run Text=" | "/>
<Run Text="{Binding Narration}" FontStyle="Italic" Foreground="Blue"/>
</TextBlock>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<local:NumReport Grid.Column="2" Text="{Binding Receivable}" />
<local:NumReport Grid.Column="3" Text="{Binding Receipt}" />
<local:NumReport Grid.Column="4" Text="{Binding Balance}" Margin="0 0 20 0"/>
<Border Grid.Column="5" Width="{Binding Source={x:Static SystemParameters.VerticalScrollBarWidth}}">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding ComputedVerticalScrollBarVisibility, ElementName=scroll}" Value="Visible">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
<Separator Grid.Row="1" Grid.ColumnSpan="5" Background="LightBlue" Margin="0 5 0 5"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="{Binding Source={x:Static SystemParameters.VerticalScrollBarWidth}}"/>
</Grid.ColumnDefinitions>
<Border Grid.Row="1" Grid.ColumnSpan="5" Background="AliceBlue"/>
<Separator Grid.Row="0" Grid.ColumnSpan="5"/>
<TextBlock Grid.Row="1" Text="Total" FontWeight="Bold" Margin="20 0 0 0"/>
<local:NumReport Grid.Row="1" Grid.Column="2" FontWeight="Bold" Text="{Binding TotalReceivable}"/>
<local:NumReport Grid.Row="1" Grid.Column="3" FontWeight="Bold" Text="{Binding TotalReceipt}"/>
<Separator Grid.Row="2" Grid.ColumnSpan="5"/>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
沒有這兩行:
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">12</sys:Double>
<sys:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">12</sys:Double>
在App.xaml
中它按預期工作! 另一件事是在App.xaml
添加那些 MergedDictionaries 之后,現在我的 Generic.xaml 上到處都是紅色Generic.xaml
。
如果我不更改 App.xaml 中的這些參數,它看起來像預期的那樣:
將資源添加到App.xaml
確實有效。
不過,您引用ResourceDictionary
的方式是錯誤的。 您應該將其合並到App.xaml
:
<Application x:Class="WpfApp1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
xmlns:sys="clr-namespace:System;assembly=System.Runtime">
<Application.Resources>
<ResourceDictionary>
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">15</sys:Double>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/RentManager;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
我不確定我是否正確,實際上無法更改常量VerticalScrollBarWidth
或HorizontalScrollBarHeight
(在我的情況下 Width 和 Height 始終為 17)但在運行時系統使用這些鍵值來呈現應用程序的根據您想要的寬度滾動條。 因此,在我看來,最好的解決方法是在這樣的地方聲明一個常量:
public const double ScrollBarThickness = 12;
而不是設置這些:
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">12</sys:Double>
<sys:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">12</sys:Double>
在App.xaml
中以這種方式在App.xaml.cs
中設置這些值:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Resources.Add(SystemParameters.VerticalScrollBarWidthKey, Constants.ScrollBarThickness);
Resources.Add(SystemParameters.HorizontalScrollBarHeightKey, Constants.ScrollBarThickness);
}
並在您需要的任何地方使用該常量進行綁定。 在我的情況下:我想在我的自定義控件中重新定義這兩個Grid.Column
定義和虛擬邊框的寬度,如下所示:
<ColumnDefinition Width="{Binding Source={x:Static con:Constants.ScrollBarThickness}}"/>
<Border Grid.Column="5" Width="{Binding Source={x:Static con:Constants.ScrollBarThickness}}">
我實際上根本不需要那些合並技術,沒有這些就可以了! 我也很想在App.xaml
中綁定常量,但我不知道如何為VerticalScrollBarWidthKey
或VerticalScrollBarWidthKey
定義樣式。 什么是屬性名稱 (???):
<Style x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">
<Setter Property="???" Value="{Binding Source={x:Static con:Constants.ScrollBarThickness}}"/>
</Style>
如果我想在App.xaml
而不是App.xaml.cs
中綁定?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.