2011-06-03 14 views
20

मुझे एक नियंत्रण मिला है जिसमें मुख्य रूप से एक छवि और एक बटन शामिल है। मैं छवि की पीठ पर छवि मेटा डेटा प्रदर्शित करना चाहते हैं और नियंत्रण फ्लिप क्षैतिज जब बटन दबाया जाता है:डब्ल्यूपीएफ नियंत्रण फ्लिप

यानी

enter image description here

"जानकारी" बटन पर क्लिक करें ...

enter image description here

घुमाएं धुरी के चारों ओर 180 degs ...

enter image description here

मेटा डेटा (या जो भी वास्तव में) के साथ छवि का "पिछला" दिखाएं।

स्पष्ट रूप से जब लाल "बंद" बटन क्लिक किया जाता है, तो छवि अंतिम 180 डिग्री के आसपास घूमती है ताकि छवि फिर से दिखाई दे।

मैं वास्तव में XAML में किसी भी 3 डी नहीं किया है, लेकिन मैं नहीं देख सकते हैं क्यों यह भी जटिल हो जाएगा ...

+0

में इस वापस किया था प्रदान की क्या आप घूर्णन को एनिमेट करना चाहते हैं? – Matt

+0

हां और नहीं। मुझे एनीमेशन को बंद करने में सक्षम होना चाहिए क्योंकि ऐप को स्थानीय रूप से और रिमोट कनेक्शन पर इस्तेमाल किया जाएगा। क्षमा करें - यह स्पष्ट नहीं किया :) –

उत्तर

10

यह 3 डी के बिना किया जा सकता है।

<Image RenderTransformOrigin="0.5,0.5"> 
    <Image.RenderTransform> 
     <ScaleTransform ScaleX="-1" /> 
    </Image.RenderTransform> 
</Image> 

आप ScaleX संपत्ति चेतन प्रभाव घूर्णन प्राप्त करने के लिए कर सकते हैं: ScaleEffect-1 को 1 से क्षैतिज पैमाने बदल रहा है के साथ एक ही दृश्य प्रभाव पड़ता है। आपको इसकी Viisibility को Visible से Hidden और इसके विपरीत भी बदलना चाहिए। 90 डिग्री घूर्णन के बाद छवि गायब होने के लिए। उसी समय बैक पैनल दिखाई देना चाहिए।

+0

यह केवल छवि को फ़्लिप करता है, पूछताछ की छवि का पीछे की ओर है। –

+0

हां, लेकिन क्या वह उसी प्रभाव का उपयोग करके छवि के पीछे की ओर दिखाई देने का अनुकरण नहीं कर सका, लेकिन दूसरी तरफ? – metalcam

+0

मैं कर सकता हूं, लेकिन मुझे लगता है कि स्केलएक्स अकेले घूर्णन को बहुत सपाट दिखता है ... बस यह समझने की कोशिश कर रहा है कि इसे कुछ गहराई देने के लिए किस स्काई की आवश्यकता है :) –

1

look at this project है।

मैं डब्लूएलएफ में सिल्वरलाइट के विमान अनुमानों की प्रतीक्षा कर रहा हूं।

9

एक UserControl जो flippable है:

<UserControl x:Class="Test.UserControls.FlipControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Test.UserControls" Name="control"> 
    <UserControl.Resources> 
     <ContentControl x:Key="BackSide" Content="{Binding Source={x:Reference control}, Path=Back}" RenderTransformOrigin="0.5,0.5"> 
      <ContentControl.RenderTransform> 
       <ScaleTransform ScaleX="-1" /> 
      </ContentControl.RenderTransform> 
     </ContentControl> 
    </UserControl.Resources> 
    <ContentControl RenderTransformOrigin="0.5,0.5"> 
     <ContentControl.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform x:Name="transform" ScaleX="1" /> 
      </TransformGroup> 
     </ContentControl.RenderTransform> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="Content" Value="{Binding ElementName=control, Path=Front}" /> 
       <Style.Triggers> 
        <DataTrigger Value="True"> 
         <DataTrigger.Binding> 
          <Binding ElementName="transform" Path="ScaleX"> 
           <Binding.Converter> 
            <local:LessThanXToTrueConverter X="0" /> 
           </Binding.Converter> 
          </Binding> 
         </DataTrigger.Binding> 
         <DataTrigger.Setters> 
          <Setter Property="Content" Value="{StaticResource BackSide}"/> 
         </DataTrigger.Setters> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</UserControl> 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 
using System.Windows.Media.Animation; 

namespace Test.UserControls 
{ 
    /// <summary> 
    /// Interaction logic for FlipControl.xaml 
    /// </summary> 
    public partial class FlipControl : UserControl, INotifyPropertyChanged 
    { 
     public static readonly DependencyProperty FrontProperty = 
      DependencyProperty.Register("Front", typeof(UIElement), typeof(FlipControl), new UIPropertyMetadata(null)); 
     public UIElement Front 
     { 
      get { return (UIElement)GetValue(FrontProperty); } 
      set { SetValue(FrontProperty, value); } 
     } 

     public static readonly DependencyProperty BackProperty = 
      DependencyProperty.Register("Back", typeof(UIElement), typeof(FlipControl), new UIPropertyMetadata(null)); 
     public UIElement Back 
     { 
      get { return (UIElement)GetValue(BackProperty); } 
      set { SetValue(BackProperty, value); } 
     } 

     public static readonly DependencyProperty FlipDurationProperty = 
      DependencyProperty.Register("FlipDuration", typeof(Duration), typeof(FlipControl), new UIPropertyMetadata((Duration)TimeSpan.FromSeconds(0.5))); 
     public Duration FlipDuration 
     { 
      get { return (Duration)GetValue(FlipDurationProperty); } 
      set { SetValue(FlipDurationProperty, value); } 
     } 

     private bool _isFlipped = false; 
     public bool IsFlipped 
     { 
      get { return _isFlipped; } 
      private set 
      { 
       if (value != _isFlipped) 
       { 
        _isFlipped = value; 
        OnPropertyChanged(new PropertyChangedEventArgs("IsFlipped")); 
       } 
      } 
     } 

     private IEasingFunction EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut }; 

     public FlipControl() 
     { 
      InitializeComponent(); 
     } 

     public void Flip() 
     { 
      var animation = new DoubleAnimation() 
      { 
       Duration = FlipDuration, 
       EasingFunction = EasingFunction, 
      }; 
      animation.To = IsFlipped ? 1 : -1; 
      transform.BeginAnimation(ScaleTransform.ScaleXProperty, animation); 
      IsFlipped = !IsFlipped; 
      OnFlipped(new EventArgs()); 
     } 

     public event EventHandler Flipped; 

     protected virtual void OnFlipped(EventArgs e) 
     { 
      if (this.Flipped != null) 
      { 
       this.Flipped(this, e); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, e); 
      } 
     } 
    } 

    public class LessThanXToTrueConverter : IValueConverter 
    { 
     public double X { get; set; } 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return (double)value < X; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 

प्रयोग उदाहरण:

<uc:FlipControl x:Name="fc"> 
    <uc:FlipControl.Front> 
     <Image Source="/Images/Default.ico" /> 
    </uc:FlipControl.Front> 
    <uc:FlipControl.Back> 
     <Image Source="/Images/Error.ico" /> 
    </uc:FlipControl.Back> 
</uc:FlipControl> 
fc.Flip(); 
+0

हाँ, मैं एक्स-स्केल ट्रांसफॉर्म की कोशिश कर रहा हूं और यह देता है घूर्णन की एक उपस्थिति, क्योंकि नियंत्रण skew नहीं है, यह काफी फ्लैट लग रहा है। मैं जांच जारी रखूंगा, लेकिन सादगी के लिए इस पर अच्छी तरह से निपट सकता हूं :) –

+0

मैंने इसे दो बार फ़्लिप करके फ्लिप बैकसाइड समस्या "तय" की है; आप इसके बारे में फ्लैट दिख रहे हैं, लेकिन मुझे संदेह है कि एक साधारण स्कू ट्रांसफॉर्म इसे अच्छा लगेगा, एक परिप्रेक्ष्य परिवर्तन बेहतर होगा। –

+0

हाँ, इसे उचित परिप्रेक्ष्य प्राप्त करने के लिए वास्तव में कतरनी की आवश्यकता है और ऐसा करने के लिए 3 डी की आवश्यकता है। जब मैं यूआई पर अधिक समय बिताने का औचित्य साबित कर सकता हूं तो मैं इसकी जांच करूंगा :) –

0

आप इस ब्लॉग से पता चलता है जो करने के लिए कैसे से विचार का उपयोग कर सकते यह सिल्वरलाइट में है। सुंदर ज्यादा एक ही WPF में काम करता है, तो हम प्रोजेक्शन http://jobijoy.blogspot.com/2009/04/3d-flipper-control-using-silverlight-30.html

+0

उस पर इंटरैक्शन तर्क चीज अबाध है, इसलिए विचार ठीक हो सकता है, लेकिन मैं इसे पूरी तरह से फिर से लिखने का सुझाव दूंगा। –

+0

आगे क्या आप वाकई एक रेंडरट्रांसफॉर्म बना सकते हैं जो इस तरह व्यवहार करता है? –

5

पुराने पोस्ट मुझे पता है के बजाय ViewPort3D उपयोग करेगा, लेकिन http://thriple.codeplex.com/ पर एक नज़र डालें

जोश स्मिथ एक नियंत्रण है कि 2009

संबंधित मुद्दे