14

TextBlock の幅を、コンテナーの幅から TextBlock に設定されたマージンを引いたものに基づいて設定したいと考えています。

これが私のコードです:

<TextBlock x:Name="txtStatusMessages" 
           Width="{Binding ElementName=LayoutRoot,Path=ActualWidth }"
                   TextWrapping="WrapWithOverflow" 
           Foreground="White" 
           Margin="5,5,5,5">This is a message
</TextBlock>

これは、左右の余白が 5 に設定されているために TextBlock が 10 単位大きすぎることを除けば、うまく機能します。

わかりました、そう思いました... コンバーターを使用しましょう。しかし、コンテナー コントロールの ActualWidth を渡す方法がわかりません (上記を参照: LayoutRoot)。

コンバーターの使用方法、およびパラメーターを使用したコンバーターの使用方法も知っていますが、パラメーターのようなものではありません...

たとえば、私はこれを機能させることができません:

Width="{Binding Converter={StaticResource PositionConverter},  
       ConverterParameter={Binding ElementName=LayoutRoot,Path=ActualWidth }}"

今夜は Google は役に立たないので、これを十分に明確にして、あなたが助けてくれることを願っています。

4

5 に答える 5

14

パラメータではなく、他のコントロールをソースとして使用することになっています。パラメータは定数である必要があり、あなたの場合は -5 にすることができます。

私は現時点でVSの近くにいないので、構文が不正確かもしれませんが、次のようなものです:

Width="{Binding ElementName=LayoutRoot, Path=ActualWidth,
Converter={StaticResource PositionConverter}, ConverterParameter=-5}"

(コンバーターは文字列として -5 を受け取り、使用する前に数値に変換する必要があります。)

私の経験から、DependecyProperty XXX の OnXXXChanged コールバックを使用し、同じウィンドウ/ルート コントロール内のコントロールを別のコントロールにバインドしない方がよいでしょう。この理由の 1 つは、後でそれらを外部要素にバインドしたい場合があることです。

または、マルチバインディングを使用します。

<TextBlock>
    <TextBlock.Width>
        <MultiBinding Converter="{StaticResource yourConverter}">
            <MultiBinding.Bindings>
                <Binding /> <!-- Bind to parameter 1 here -->
                <Binding /> <!-- Bind to parameter 2 here -->
          </MultiBinding.Bindings>
        </MultiBinding>
    </TextBlock.Width>
</TextBlock>

そして、2 つのパラメーターを必要な値に変換するコンバーター。

于 2008-11-23T05:46:45.050 に答える
7

はい..マルチバインディングは私のために働きます..実際に私はconvereterparameterとして要素を送信しようとしましたが、それは受け入れません。そのため、要素を値としてコンバータークラスに渡しました。

以下は私の例です。

<ListView ... >
<ListView.View>
<GridView>
    <GridViewColumn Header="xyz" >

        <GridViewColumn.Width>
            <MultiBinding Converter="{StaticResource GetWidthfromParentControl}">
                <MultiBinding.Bindings>
                    <Binding ElementName="lstNetwork" Path="ActualWidth"/>
                    <Binding ElementName="MyGridView"/>
                </MultiBinding.Bindings>
            </MultiBinding>
        </GridViewColumn.Width>
    ....
    </GridViewColumn>
    <GridViewColumn ...>
    ....
    </GridViewColumn>
</GridView>
</ListView.View>
</ListView>

ウィンドウのサイズ変更では、他の2つのgridviewcolumnsではなく、最初のgridviewcolumnのサイズを変更する必要があります。listviewのActualwidthと、要素として合計gridviewオブジェクトを渡しました。コンバーターコードを使用する場合...

class GetWidthfromParentControl : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        GridView view = values[1] as GridView;
        GridViewColumnCollection collc = view.Columns;
        double actualWidths = collc[1].ActualWidth + collc[2].ActualWidth;
        return ((double)values[0] - actualWidths );
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    #endregion
}

これは私のために働いた...:)

于 2009-07-30T10:41:05.060 に答える
3

あなたの問題を解決するためのより良い方法があると思いますが、あなたがやりたいことに対する答えがあると思います。(コンテナのタイプについては言及していません。たとえば、StackPanelが幅の計算を処理します。以下のTextBox#2を参照してください)

最初に XAML

<Window x:Class="WpfApplication1.Window2" ...
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window2" Height="300" Width="300">
    <Window.Resources>
        <local:WidthSansMarginConverter x:Key="widthConverter" />
    </Window.Resources>
    <Grid>
        <StackPanel x:Name="stack">
            <TextBlock x:Name="txtStatusMessages" 
                    Width="{Binding ElementName=stack,Path=ActualWidth, 
                        Converter={StaticResource widthConverter}}"
                    TextWrapping="WrapWithOverflow" 
                    Background="Aquamarine" 
                    Margin="5,5,5,5">
                This is a message
            </TextBlock>
            <TextBlock x:Name="txtWhatsWrongWithThis" 
                    TextWrapping="WrapWithOverflow" 
                    Background="Aquamarine" 
                    Margin="5,5,5,5">
                This is another message
            </TextBlock>
        </StackPanel>
    </Grid>
</Window>

次にコンバーター。ここで問題があります.. Convert メソッドの ConverterParameter は、何らかの理由で動的な値にすることができないためです。そこで、Window の ctor に設定した Converter のパブリック プロパティを介して Textbox Margin をこっそりと取り込みます。 WidthSansMarginConverter.cs

public class WidthSansMarginConverter : IValueConverter
    {
        private Thickness m_Margin = new Thickness(0.0);

        public Thickness Margin
        {
            get { return m_Margin; }
            set { m_Margin = value; }
        }
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(double)) { return null; }

            double dParentWidth = Double.Parse(value.ToString());
            double dAdjustedWidth = dParentWidth-m_Margin.Left-m_Margin.Right;
            return (dAdjustedWidth < 0 ? 0 : dAdjustedWidth);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }

Window2.xaml.cs

        public Window2()
        {
            InitializeComponent();

            WidthSansMarginConverter obConverter = this.FindResource("widthConverter") as WidthSansMarginConverter;
            obConverter.Margin = txtStatusMessages.Margin;
        }

HTH。演習をありがとう:)

于 2008-11-23T06:19:07.263 に答える
0

テキストボックスが LayoutRoot の直接の子である場合は、テキストボックスに次のプロパティを設定するだけです

HorizontalAlignment="Stretch"
于 2009-01-05T19:01:41.040 に答える
0

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7298ceb5-bf56-47aa-a161-5dd99189408bによると、コンバーターがから派生している場合、依存関係プロパティをカスタム コンバーターに追加できます。依存オブジェクト。

その場合、データ バインディングを使用して、XAML で (リソース ディクショナリで) コンバーターを定義するプロパティに値を渡すこともできます。

于 2012-07-03T16:05:03.820 に答える