簡體   English   中英

C#/ WPF組合框模板化項目的高度

[英]C# / wpf combobox templated item height

我正在制作一個帶有按鈕和組合框的用戶控件。 組合框是只讀的。 我定義了一個DataTemplate ,並且組合框中的ItemsSource設置為一個雙精度列表,該列表等於我在用戶控件中定義為依賴項屬性的值的百分比。 我的意圖是在用戶控件中顯示每個值的百分比。

一切正常,除了打開組合框下拉菜單時項目的高度大約是組合框本身高度的兩倍,當我選擇一個時,它將用戶控件的高度設置為組合框的大小。

未打開的組合框

選擇項目后的組合框

如果我遺漏了模板,則組合框中的項目大小將調整為組合框的原始高度,並且組合框保持在其原始高度。

我希望打開cobo的下拉菜單時保持項目的高度,以保持原始組合框的大小,並且當我從下拉菜單中選擇一個項目時,我不希望組合框調整大小。

任何人都知道如何做到這一點?

XAML:

<UserControl x:Class="FEAServer.UI.Controls.TorqueControl" Name="theControl"
        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:valconv="clr-namespace:FEAServer.Common.ValueConverters;assembly=FEAServer.Common.ValueConverters"
        xmlns:localconv="clr-namespace:FEAServer.UI.Controls.Converters"
        xmlns:localprops="clr-namespace:FEAServer.UI.Controls.Properties"
        mc:Ignorable="d">
<UserControl.Resources>
    <valconv:UnitsOfMeasureConverter x:Key="UOMConv" />
    <localconv:TorquePercentageConverter x:Key="TorquePCTConv"/>
    <DataTemplate x:Key="LoadCasesDataTemplate">
        <Label>
            <Label.Content>
                <MultiBinding Converter="{StaticResource TorquePCTConv}" ConverterParameter="{x:Static valconv:UnitsOfMeasureUnit.TORQUE}">
                    <Binding ElementName="theControl" Path="UnitsOfMeasure"/>
                    <Binding />
                    <Binding ElementName="theControl" Path="AnalysisTorque" />
                    <Binding Source="{StaticResource UOMConv}" />
                    <Binding Source="{x:Static localprops:Resources.torqueFormatString}"/>
                </MultiBinding> 
            </Label.Content>
        </Label>
    </DataTemplate>
</UserControl.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <ComboBox Name="cbSelectTorque" Height="Auto" Grid.Column="0" IsReadOnly="True"
              HorizontalAlignment="Stretch" ItemsSource="{Binding TorquePercentages}"
              VerticalAlignment="Center" ItemTemplate="{StaticResource LoadCasesDataTemplate}"
              Margin="3,3,0,3">
    </ComboBox>
    <Button Name="btnUnits" Width="Auto" Height="{Binding ElementName=cbSelectTorque, Path=Height}"
            Grid.Column="1" Margin="3" Click="btnUnits_Click">
        <Button.Content>
            <MultiBinding Converter="{StaticResource UOMConv}" ConverterParameter="{x:Static Member=valconv:UnitsOfMeasureUnit.TORQUE}">
                <MultiBinding.Bindings>
                    <Binding Path="UnitsOfMeasure" Mode="OneWay" />
                </MultiBinding.Bindings>
            </MultiBinding>
        </Button.Content>
    </Button>
</Grid>

C#:

public partial class TorqueControl : UserControl
{
    bool _isTorqueConfigurable;

    public static DependencyProperty UnitsOfMeasureProperty = DependencyProperty.
        Register("UnitsOfMeasure", typeof(UnitsOfMeasureSystem), typeof(TorqueControl),
        new PropertyMetadata(new PropertyChangedCallback(OnUnitsOfMeasureChanged)));

    public static DependencyProperty AnalysisTorqueProperty = DependencyProperty.
        Register("AnalysisTorque", typeof(double), typeof(TorqueControl),
        new PropertyMetadata(new PropertyChangedCallback(OnAnalysisTorqueChanged)));

    public static DependencyProperty TorquePercentagesProperty = DependencyProperty.
        Register("TorquePercentages", typeof(ObservableCollection<double>), typeof(TorqueControl),
        new PropertyMetadata(new PropertyChangedCallback(OnTorquePercentagesChanged)));

    public TorqueControl()
    {
        this.DataContext = this;
        InitializeComponent();
    }

    public UnitsOfMeasureSystem UnitsOfMeasure
    {
        get
        {
            return (UnitsOfMeasureSystem)GetValue(UnitsOfMeasureProperty);
        }
        set
        {
            if ((UnitsOfMeasureSystem)GetValue(UnitsOfMeasureProperty) != value)
            {
                SetValue(UnitsOfMeasureProperty, value);
            }
        }
    }

    static void OnUnitsOfMeasureChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TorqueControl cont = d as TorqueControl;
        if(cont != null)
        {
            cont.UnitsOfMeasure = (UnitsOfMeasureSystem)e.NewValue;
        }
    }

    public double AnalysisTorque
    {
        get
        {
            return (double)GetValue(AnalysisTorqueProperty);
        }
        set
        {
            if ((double)GetValue(AnalysisTorqueProperty) != value)
            {
                SetValue(AnalysisTorqueProperty, value);
            }
        }
    }

    static void OnAnalysisTorqueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TorqueControl cont = d as TorqueControl;
        if (cont != null)
        {
            cont.AnalysisTorque = (double)e.NewValue;
        }
    }

    public ObservableCollection<double> TorquePercentages
    {
        get
        {
            return (ObservableCollection<double>)GetValue(TorquePercentagesProperty);
        }
        set
        {
            if ((ObservableCollection<double>)GetValue(TorquePercentagesProperty) != value)
            {
                SetValue(TorquePercentagesProperty, value);
            }
        }
    }

    static void OnTorquePercentagesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TorqueControl cont = d as TorqueControl;
        if (cont != null)
        {
            cont.TorquePercentages = (ObservableCollection<double>)e.NewValue;
        }
    }

    public bool IsTorqueConfigurable
    {
        get
        {
            return _isTorqueConfigurable;
        }
        set
        {
            if (_isTorqueConfigurable != value)
            {
                _isTorqueConfigurable = value;
            }
        }
    }
    private void btnUnits_Click(object sender, RoutedEventArgs e)
    {
        if (UnitsOfMeasure == UnitsOfMeasureSystem.ENGLISH)
        {
            UnitsOfMeasure = UnitsOfMeasureSystem.METRIC;
        }
        else
        {
            UnitsOfMeasure = UnitsOfMeasureSystem.ENGLISH;
        }
    }
}

當我最初發布此內容時,我嘗試了各種方式將標簽的高度綁定到組合框,項目控件等的高度,設置Margin屬性,然后打開。 經過更多搜索,我發現什么對我來說足夠好。 我將Label的“ Padding”屬性設置為0。MS的Control.Padding屬性文檔說默認值是0。在這種情況下,必須將其設置為非0的值。將填充屬性設置為0將覆蓋其設置的值。 選擇項目時,它不會調整組合框的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM