slider control and textblock control interaction-Metro apps

谁说我不能喝 提交于 2020-01-06 15:51:16

问题


i am trying to set the slider control to value from text block's text property through {Binding} on XAML.

<Slider   ValueChanged="slider_ValueChanged_1"    Value= "{Binding ElementName=ComponentTextBlockValue,Path=Text}"   StepFrequency="25"/>  

Do i need an converter to set the slider's value . The binding seems to work sometimes but sometimes it doesn't work. Sometimes,the slider just doesn't set its value to text block value.


回答1:


Since you bind the Slider's value directly without a value converter, I suspect that the binding is broken when the text is not a number or out of range.

You can prevent that by creating a value converter that will prevent bad value to be bound, so the binding will always work.

Here is some example:

public class TextToSliderValueConverter : IValueConverter
{
    public double MaximumSliderValue { get; set; }
    public double MinimumSliderValue { get; set; }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        double sliderValue;

        if (double.TryParse(value as string, out sliderValue)
            && sliderValue <= MaximumSliderValue && sliderValue >= MinimumSliderValue)
        {
            return sliderValue;
        }
        else
        {
            return 0.0;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

Here is the XAML:

<Page
    x:Class="stovfSliderTextBox.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:stovfSliderTextBox"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>
        <local:TextToSliderValueConverter x:Key="txtToSliderValue" MaximumSliderValue="100" MinimumSliderValue="0"/>
    </Page.Resources>
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel>
            <Slider Value= "{Binding ElementName=ComponentTextBlockValue,Path=Text, Converter={StaticResource txtToSliderValue}, ConverterParameter=slider}" StepFrequency="25"/>
            <TextBox x:Name="ComponentTextBlockValue" Width="50"/>
        </StackPanel>
    </Grid>
</Page>

The TextToSliderValueConverter makes sure that the slider will always get the valid value. If you do not use default Slider.Maximum or Slider.Minimum, you can modify the values accordingly.

Hope this helps!



来源:https://stackoverflow.com/questions/16519272/slider-control-and-textblock-control-interaction-metro-apps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!