1

私が探しているのは、レイアウト グリッドでテキストブロックとコンボ ボックスを管理することです。コンボボックスは、その選択に合わせてサイズを変更する必要があります (Width=Auto)。テキストブロックは、必要に応じて楕円でトリミングする必要があります。または、トリミングされていない場合は、列がテキストブロックの幅を超えて拡大するのを停止する必要があります。代わりに、空白がコンボの右側に拡大する必要があります。したがって、テキストブロックがトリミングされているときは Width="*" 、トリミングされていないときは Width="Auto" の組み合わせを探しています。MaxWidthが「Auto」に対応してくれたら最高です。

グローバル化された値で変更されるため、テキストブロック列の特定の MaxWidth を設定したくありません。また、xaml のみのソリューションがあればいいのですが、そうでない場合はまあまあです。また、グリッドがこれの正しいコンテナーではない可能性があります。

ここに例があります。左の列には Width="*" と MaxWidth="150" があります。これは正しく機能しますが、このように MaxWidth を指定すると、テキストブロック内のグローバル化されたテキストでは機能しません。もっとダイナミックなものが必要です。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" MaxWidth="150"/>
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <TextBlock HorizontalAlignment="Left" Text="Input control one" VerticalAlignment="Center" TextTrimming="CharacterEllipsis" Margin="2"/>
    <TextBlock HorizontalAlignment="Left" Text="Input control two" VerticalAlignment="Center" Grid.Row="1" TextTrimming="CharacterEllipsis" Margin="2"/>
    <TextBlock HorizontalAlignment="Left" Text="Input control number three" VerticalAlignment="Center" Grid.Row="2" TextTrimming="CharacterEllipsis" Margin="2"/>
    <ComboBox HorizontalAlignment="Left" d:LayoutOverrides="Height" VerticalAlignment="Center" Grid.Column="1" Margin="2">
        <ComboBoxItem Content="Item One" IsSelected="True"/>
    </ComboBox>
    <ComboBox HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" Margin="2">
        <ComboBoxItem Content="Item One" />
        <ComboBoxItem Content="Item Number Two" IsSelected="True"/>
    </ComboBox>
</Grid>

解決...

解決策を教えてくれたLeoに感謝します。添付プロパティから MaxWidth を計算する方法を理解する必要がありました。重要なのは、列内のすべての要素の最大幅を取得することでした。また、無限を使用して要素を再測定して、目的の幅全体を取得する必要がありました。そうしないと、トリミングされた希望の幅が得られる可能性があります。

    /// <summary>
    /// AutoMaxWidth Dependency Property allows a ColumnDefinition to automatically default
    /// it's MaxWidth to the correct width on the Load event of the ColumnDefinition. 
    /// </summary>
    public static readonly DependencyProperty AutoMaxWidthAttachedProperty =
            DependencyProperty.RegisterAttached ("AutoMaxWidth", 
                                                 typeof (bool), 
                                                 typeof (ColumnBehavior),
                                                 new UIPropertyMetadata (false, OnAutoMaxWidthAttachedPropertyChanged));

    /// <summary>
    /// Called when the AutoMaxWidth property has changed values
    /// </summary>
    /// <param name="o">The object this behavior is attached to.</param>
    /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
    static void OnAutoMaxWidthAttachedPropertyChanged (DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        ColumnDefinition col = (o as ColumnDefinition);
        if (col == null) return;

        if ((bool)e.NewValue)
            col.Loaded += col_Loaded;
        else
            col.Loaded -= col_Loaded;
    }

    static void col_Loaded (object sender, RoutedEventArgs e)
    {
        ColumnDefinition col = sender as ColumnDefinition;
        if (col == null) return;

        Grid g = col.Parent as Grid;
        if (g == null) return;

        int index = g.ColumnDefinitions.IndexOf (col);
        foreach (UIElement el in g.Children)
            if (Grid.GetColumn (el) == index)
            {
                el.Measure (new Size (Double.PositiveInfinity, el.DesiredSize.Height));
                if (col.MaxWidth == Double.PositiveInfinity)
                    col.MaxWidth = el.DesiredSize.Width;
                else
                    col.MaxWidth = Math.Max (col.MaxWidth, el.DesiredSize.Width);
            }
    }
4

1 に答える 1

1

ColumnDefinition の MaxWidthを明示的に設定するか、TextBox/ComboBox の幅が更新されたときに MaxWidth を設定する独自のロジックを作成します。添付プロパティを使用してこれを実現し、それを Grid.ColumnDefinitions に添付できます。WPF は強力で、使い方さえわかれば何でもできます。

差し支えなければ、現在お使いのサンプル コードを提供していただけますか。

于 2012-08-28T01:52:07.340 に答える