wp7滑块挂断了

时间:2012-02-07 21:39:48

标签: silverlight windows-phone-7

我正在尝试使用滑块控件。这只是简单的控制。没有什么花哨。但是我遇到了令我困惑的问题。

如果我将控件放在测试页面上(空白时没有别的)并在应用程序启动后立即导航到它,我可以完美地滑动它。但是如果我首先导航到另一个页面然后再到测试页面。我得到一个非常奇怪的行为。滑块控件按步进移动。好像它挂起或正在失去焦点。

我正在使用wp7.1,我已经在模拟器和手机上进行了测试。两者都给我相同的结果。我甚至都不知道从哪里开始解决这个问题,但我确实需要一个滑块并让它顺利移动。

有什么想法吗?

修订为包含xaml:

<phone:PhoneApplicationPage 
x:Class="WP7ListBoxSelectedItemStyle.TestPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
xmlns:local="clr-namespace:WP7ListBoxSelectedItemStyle"
xmlns:my="clr-namespace:colordata_controls;assembly=colordata_controls"
shell:SystemTray.IsVisible="True" xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit">

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="IPO" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="Test" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="8,17,16,-17">
        <Slider Height="84" HorizontalAlignment="Left" Margin="10,10,0,0" Name="slider1" VerticalAlignment="Top" Width="460" />
    </Grid>
</Grid>

这是指向模拟器中的视频的链接。 https://vimeo.com/36428677

1 个答案:

答案 0 :(得分:0)

所以,我仍然不知道为什么滑块会这样粘,但为了继续前进,我创建了自己的滑块。希望此代码可以帮助其他人。

XAML:

<UserControl 
x:Name="userControl" 
x:Class="controls.pSlider"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignWidth="76" d:DesignHeight="400" Background="Gray" Foreground="White">

<Grid x:Name="LayoutRoot" Background="Transparent" MouseMove="LayoutRoot_MouseMove" MouseLeftButtonDown="LayoutRoot_MouseLeftButtonDown">
    <Grid.RowDefinitions>
        <RowDefinition Height="10"/>
        <RowDefinition/>
        <RowDefinition Height="10"/>
    </Grid.RowDefinitions>
    <Rectangle x:Name="colorBar" Margin="20,6" Width="10" Fill="{Binding Background, ElementName=userControl}" Grid.Row="1"/>
    <Grid x:Name="g_container" Grid.Row="1" Margin="0,1,0,13">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="0"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid x:Name="g_thumb" Height="0" VerticalAlignment="Top" Grid.Row="1">
            <Canvas Height="0" VerticalAlignment="Top">
                <Path Data="M0,0 L1,0 L1.2,0.5 L1,1 L0,1 z" Margin="0" Stretch="Fill" UseLayoutRounding="False" Width="33" RenderTransformOrigin="0.5,0.5" StrokeThickness="0" Fill="{Binding Foreground, ElementName=userControl}" Height="12" d:LayoutOverrides="VerticalAlignment"/>
                <Path Data="M0.3,0.5 L0.5,0 L1.5,0 L1.5,1 L0.5,1 z" Margin="0" Stretch="Fill" UseLayoutRounding="False" Width="33" RenderTransformOrigin="0.5,0.5" StrokeThickness="0" Fill="{Binding Foreground, ElementName=userControl}" Height="12" Canvas.Left="43" d:LayoutOverrides="VerticalAlignment"/>
            </Canvas>
        </Grid>
        <Rectangle x:Name="r_lifter" Margin="0" Grid.Row="2" Height="188" StrokeThickness="0"/>
    </Grid>
</Grid>

代码:

namespace controls {
public partial class pSlider : UserControl {

    public event RoutedEventHandler ValueChanged;

    public static readonly DependencyProperty MaxProperty =
    DependencyProperty.Register("Maximum", typeof(double), typeof(pSlider), new PropertyMetadata(100.0));

    public double Maximum {
        get { return (double)GetValue(MaxProperty); }
        set { SetValue(MaxProperty, value); }
    }

    public static readonly DependencyProperty MinProperty =
    DependencyProperty.Register("Minimum", typeof(double), typeof(pSlider), new PropertyMetadata(0.0));

    public double Minimum {
        get { return (double)GetValue(MinProperty); }
        set { SetValue(MinProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", typeof(double), typeof(pSlider), new PropertyMetadata(50.0));

    public double Value {
        get { return (double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public pSlider() {
        InitializeComponent();
        Loaded += new RoutedEventHandler(pSlider_Loaded);
    }

    void pSlider_Loaded(object sender, RoutedEventArgs e) {

        if (Value > Maximum)
            Value = Maximum;
        else if (Value < Minimum)
            Value = Minimum;

        double min = 0;
        double max = g_container.ActualHeight;

        r_lifter.Height = Value / (Maximum - Minimum) * (max - min);

    }

    private Point Position;

    private void LayoutRoot_MouseMove(object sender, MouseEventArgs e) {
        Point newPosition = e.GetPosition((UIElement)sender);

        double delta = newPosition.Y - Position.Y;
        double temp = r_lifter.Height - delta;

        if (temp > g_container.ActualHeight)
            r_lifter.Height = g_container.ActualHeight;
        else if (temp < 0)
            r_lifter.Height = 0;
        else
            r_lifter.Height = temp;

        double min = 0;
        double max = g_container.ActualHeight;

        Value = r_lifter.Height / (max - min) * (Maximum - Minimum);
        Value = Math.Floor(Value);
        RoutedEventHandler handler = ValueChanged;
        if (handler != null)
            handler(this, e);


        Position = e.GetPosition((UIElement)sender);
    }

    private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
        Position = e.GetPosition((UIElement)sender);
    }

}

}