WPF - Передайте значение одного управления к Преобразователю для установки ширины на другом управлении

Попробуйте использовать

Попробуйте использовать [111] для перенаправления на последний посещенный URL:

if(!empty(

Попробуйте использовать

Попробуйте использовать [111] для перенаправления на последний посещенный URL:

[110]SERVER['HTTP_REFERER'] для перенаправления на последний посещенный URL:

[110]SERVER['HTTP_REFERER'])){ redirect(

Попробуйте использовать

Попробуйте использовать [111] для перенаправления на последний посещенный URL:

[110]SERVER['HTTP_REFERER'] для перенаправления на последний посещенный URL:

[110]SERVER['HTTP_REFERER']); } else { redirect(base_url()); }
SERVER['HTTP_REFERER']
для перенаправления на последний посещенный URL:

[110]
12
задан Danny Varod 19 April 2011 в 13:31
поделиться

4 ответа

Вы, как предполагается, используете другое управление в качестве источника, не параметра. Параметр должен быть константой, и в Вашем случае может быть-5.

Я не около VS в данный момент так синтаксис, возможно, неточный, однако, это - что-то как:

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

(Преобразователь получит-5 как строка и должен будет преобразовать ее в число перед использованием ее.)

На основе моего опыта лучше использовать обратный вызов OnXXXChanged DependecyProperty XXX, и не связывать средства управления в том же окне/корне управляют тем другому. Одна из причин этого - то, что можно хотеть связать их с внешним элементом позже.

Или альтернативно, используйте мультипривязку:

<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>

и и преобразователь, который преобразовывает эти два параметра в значение, которое Вы хотите.

13
ответ дан 2 December 2019 в 07:05
поделиться

Хотя я подозреваю, что может быть лучший способ решить Вашу проблему, я думаю, что у меня есть ответ для того, что Вы хотите сделать. (Вы не упоминали то, что вводит Ваш контейнер. 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>

Затем Преобразователь. У нас есть проблема здесь.. так как ConverterParameter для методов Преобразования не может быть динамическим значением по некоторым причинам. Таким образом, мы крадемся в Поле Текстового поля через общественную собственность Преобразователя, который мы устанавливаем в ctor Окна. 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. Спасибо за осуществление :)

3
ответ дан 2 December 2019 в 07:05
поделиться

Если Ваше текстовое поле является прямым ребенком LayoutRoot, просто установите следующее свойство в своем текстовом поле

HorizontalAlignment="Stretch"
0
ответ дан 2 December 2019 в 07:05
поделиться

да ... у меня работает несколько привязок ... на самом деле я пытался отправить элемент как параметр convereter, но он не принимал. вот почему я передал элемент в качестве значения классу преобразователя.

ниже мой пример ..

<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>

При изменении размера окна нужно изменить размер моего первого столбца gridview, а не двух других столбцов gridview .. Я передал фактическую ширину списка, а также общий объект 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
}

у меня это сработало ... :)

6
ответ дан 2 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: