将Win8商店应用教程改编为WPF

时间:2013-01-08 16:52:56

标签: c# wpf xaml user-controls

我正在关注如何使用XAML / C#在Visual Studio中创建Dial的this tutorial。问题是本教程针对的是Windows 8商店应用程序。

知道了,我仍然试图在支持以前操作系统的WPF应用程序中使用本教程。

我遇到了一些兼容性问题:

  1. ManipulationMode="All"不存在,因为本教程的作者将它用于我。它仅作为Manipulation.ManipulationMode="All"存在,它给出了一个错误“操纵对指定元素不活动”。我怎么能解决它?
  2. 作者在ManipulationDelta元素上设置了grid属性,我最初没有遇到任何问题...直到我意识到VS创建的作者的事件/动作代码隐藏ManipulationDeltaRoutedEventArgs e代替我的代码隐藏文件中使用的ManipulationDeltaEventArgs e。这意味着我无法使用Position属性(e.Position)轻松获取用户控件上的鼠标位置。有什么可以替代呢?我不认为它可以被支持,因为它只被声明为Win8 ......
  3. 在MVVM风格的应用程序中,代码隐藏操作已在ViewModel中设置。我如何将该动作代码“绑定”到元素的ManipulationDelta属性?
  4. 提前致谢!

    P.S;我和VS的作者版本都是2012年,所以这不是问题。

    更新: 这是部分完成的代码:

    XAML:

    //Manipulation.ManipulationMode="All" => ERROR 'Manipulation is not active on the specified element'
    <Grid Manipulation.ManipulationMode="All" ManipulationDelta="Grid_ManipulationDelta_1">
        <Ellipse Fill="#FF7171E6" Margin="30"/>
        <Grid>
            <Grid.RenderTransform>
                <RotateTransform CenterX="225" CenterY="225" Angle="{Binding Angle}"/>
            </Grid.RenderTransform>
            <Ellipse Fill="White" Height="100" VerticalAlignment="Top" Margin="50" Width="100"/>
    
        </Grid>
    </Grid>
    

    代码隐藏:

    public partial class dial : UserControl, INotifyPropertyChanged
    {
        private int m_Amount;
        public int Amount {...}
    
        private double m_Angle;
        public double Angle {...}
    
        public dial()
        {
            InitializeComponent();
            this.DataContext = this;
        }
    
        private void Grid_ManipulationDelta_1(object sender, ManipulationDeltaEventArgs e)
        {
            this.Angle = GetAngle(e.Position, this.RenderSize); //e.Position doesn't exist in ManipulationDeltaEventArgs...
            this.Amount = (int)(this.Angle / 360 * 100);
        }
    
        public enum Quadrants : int { nw = 2, ne = 1, sw = 4, se = 3 }
        private double GetAngle(Point touchPoint, Size circleSize)
        {
            var _X = touchPoint.X - (circleSize.Width / 2d);
            var _Y = circleSize.Height - touchPoint.Y - (circleSize.Height / 2d);
            var _Hypot = Math.Sqrt(_X * _X + _Y * _Y);
            var _Value = Math.Asin(_Y / _Hypot) * 180 / Math.PI;
            var _Quadrant = (_X >= 0) ?
                (_Y >= 0) ? Quadrants.ne : Quadrants.se :
                (_Y >= 0) ? Quadrants.nw : Quadrants.sw;
            switch (_Quadrant)
            {
                case Quadrants.ne: _Value = 090 - _Value; break;
                case Quadrants.nw: _Value = 270 + _Value; break;
                case Quadrants.se: _Value = 090 - _Value; break;
                case Quadrants.sw: _Value = 270 + _Value; break;
            }
            return _Value;
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
    }
    

1 个答案:

答案 0 :(得分:1)

  1. 在WPF中,您可以使用IsManipulationEnabled =&#34; true&#34;启用操作。不需要使用ManipulationMode =&#34; All&#34;像Windows商店应用程序。
  2. 您可以尝试使用Mouse.GetPosition(this)获取当前鼠标位置