Как привязать значение Slider к высоте Rectable в Silverlight (работает в WPF)? - PullRequest
1 голос
/ 12 февраля 2009

Этот код работает в WPF, но не в Silverlight.

Есть ли какие-то обходные пути в Silverlight, чтобы я мог привязать значение ползунка к высоте элемента? Каковы ограничения Silverlight здесь?

ОТВЕТ:

Спасибо Питеру за решение, для других: вот решение с онлайн-демонстрацией и загружаемым кодом .

<UserControl x:Class="Second12.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
    Width="300" Height="200">
    <Grid Background="Tan">
        <StackPanel>
            <Canvas>
                <Border Background="#2200ffff" 
            Canvas.Left="40" 
            Canvas.Top="30" 
            CornerRadius="5" 
            BorderBrush="Brown"
            BorderThickness="1">
                    <Rectangle 
            Height="{Binding ElementName=theSlider, Path=Value}"
            Width="50"/>
                </Border>
            </Canvas>
        </StackPanel>
        <Slider Name="theSlider" HorizontalAlignment="Left" Width="200" Cursor="Hand"/>
    </Grid>
</UserControl>

1 Ответ

4 голосов
/ 12 февраля 2009

Привязка ElementName не в настоящее время поддерживается в Silverlight 2. В этой статье документации MSDN довольно кратко описаны особенности функциональности WPF, которые Silverlight делает и не предоставляет в настоящее время.

А пока вы должны использовать какое-то посредническое свойство, вот полный пример:

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">

    <StackPanel x:Name="LayoutRoot" Background="AliceBlue">

        <Slider x:Name="Slider1" Minimum="10" SmallChange="10"
                LargeChange="20" Maximum="100"
                Value="{Binding HelperValue, Mode=TwoWay}" Cursor="Hand"/>

        <Rectangle x:Name="Rectangle1" Fill="Red"
                Height="{Binding HelperValue, Mode=OneWay}" Width="100" />

    </StackPanel>

</UserControl>

Page.xaml.cs:

using System;
using System.ComponentModel;
using System.Windows.Controls;

namespace SilverlightApplication1
{
    public partial class Page : UserControl
    {
        BindingConduit<double> sliderToRect = new BindingConduit<double>(50.0);

        public Page()
        {
            InitializeComponent();

            LayoutRoot.DataContext = sliderToRect;
        }
    }

    public class BindingConduit<T> : INotifyPropertyChanged where T : struct
    {
        private T helperValue;

        public T HelperValue
        {
            get { return this.helperValue; }
            set
            {
                if ((this.helperValue.Equals(value) != true))
                {
                    this.helperValue = value;
                    this.RaisePropertyChanged("HelperValue");
                }
            }
        }

        public BindingConduit(T defaultValue)
        {
            HelperValue = defaultValue;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler propertyChanged = this.PropertyChanged;

            if (propertyChanged != null)
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

Свойство Value ползунка привязано к HelperValue и имеет значение TwoWay, высота прямоугольника привязана к тому же свойству, но требует только OneWay.

Свойство HelperValue читается из экземпляра класса BindingConduit , созданного на странице с именем sliderToRect. Этот экземпляр устанавливается как DataContext родительского элемента управления StackPanel. Любое изменение в свойстве Value в Slider1 отражается в Height of Rectangle1, поскольку свойство HelperValue вызывает событие PropertyChanged.

BindingConduit - это созданный мной пользовательский класс, который реализует INotifyPropertyChanged, а также позволяет указать значение по умолчанию для HelperValue (т. Е. Начальное значение Slider1 и высота Rectangle1 (50,0) в данном случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...