Как определить, находится ли элемент управления внутри границ элемента управления окна / вкладки в WPF - PullRequest
1 голос
/ 04 августа 2010

Я хочу, чтобы высота элемента управления удваивалась, когда мышь находится над этим элементом управления, а высота элемента управления должна становиться нормальной, когда мышь покидает элемент управления.

Учтите, я использую следующий стиль для создания высоты кнопки.удваивается, когда мышь находится над кнопкой.

<Style TargetType="{x:Type Buttons}">  
<Style.Triggers>  
    <Trigger Property="IsMouseOver" Value="True">  
        <Setter Property="RenderTransform"> 
            <Setter.Value> 
                <ScaleTransform ScaleX="1" ScaleY="2" /> 
            </Setter.Value> 
        </Setter> 
        <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>  
        <Setter Property="Panel.ZIndex" Value="99999"/>  
    </Trigger>  
</Style.Triggers>  

Если кнопка расположена рядом с границей элемента управления окна / вкладки, то кнопка переходит в границы элемента управления Tab / окна, когда онарасширяется.(когда мышь находится над кнопкой)

Я не хочу, чтобы кнопка выходила за границы вкладки / окна.

Вместо этого кнопка должна перемещаться внутри окна (необходимо изменить RenderTransformOrigin), когда кнопка касается границ элемента управления Tab / окна.

Я приложил образец приложения для вашей справки здесь.

1 Ответ

1 голос
/ 04 августа 2010

Вы можете попробовать использовать конвертер на вашем сетере RenderTransformOrigin

Преобразователь примет элемент управления в качестве параметра и проверит, находится ли позиция элемента управления в его родительском элементе между 0 и (ControlHeight / 2), а затем вычисляет и возвращает другое значение RenderTransformOrigin. Если нет, просто верните значение по умолчанию (0.5,0.5)

Edit: Чтобы ответить на ваш комментарий, я не уверен в точном синтаксисе, так как я не тестирую его, но я думал о чем-то похожем на следующее:

Создайте свой конвертер. Вероятно, это будет конвертер MultiBinding

public class RenderTransformConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // Get parameters - You'll probably want to include validation and default values
        UIElement control = (UIElement)value[0];            
        UIElement parent = (UIElement)value[1];

        int controlHeight = control.Height;
        int controlXPositionInParent = control.TranslatePoint(new Point(0, 0), parent).X;

        if (controlXPositionInParent < (controlHeight * .5))
        {
            // Calculate a new render transform. 
            // Should verify I'm doing the math right, didn't get much sleep last night
            return new Point(0.5, controlXPositionInParent / controlHeight);
        }
        else
        {
            return new Point(0.5, 0.5);
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Ваш XAML будет содержать строку для включения пространства имен конвертера и создания объекта нового конвертера.

<localNamespace:RenderTransformConverter x:Key="renderTransformConverter />

Тогда ваш стиль будет использовать его примерно так:

<Setter Property="RenderTransformOrigin">
<Setter.Value>
    <MultiBinding Converter="{StaticResource renderTransformConverter}">
        <Binding Path="{Binding RelativeSource=Self}" />
        <Binding Path="{Binding RelativeSource=Self, Path=Parent}" />
    </MultiBinding>
</Setter.Value>

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

...