IP 및 호스트 이름으로 같은 망내에 있는 PC의 MacAddress를 얻어오는 코드입니다.

 

 

 

   

    static class MacAddressProvider

    {

        const int PING_TIMEOUT = 1000;

 

        [DllImport("iphlpapi.dll", ExactSpelling = true)]

        static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);

 

        // *********************************************************************

        /// <summary>

        /// Gets the MAC address from ARP table in colon (:) separated format.

        /// </summary>

        /// <param name="hostNameOrAddress">Host name or IP address of the

        /// remote host for which MAC address is desired.</param>

        /// <returns>A string containing MAC address; null if MAC address could

        /// not be found.</returns>

        public  static string GetMACAddressFromARP(string hostNameOrAddress)

        {

            if (!IsHostAccessible(hostNameOrAddress))

                return null;

 

            IPHostEntry hostEntry = Dns.GetHostEntry(hostNameOrAddress);

 

            if (hostEntry.AddressList.Length == 0)

                return null;   

           

 

            byte[] macAddr = new byte[6];

 

            uint macAddrLen = (uint)macAddr.Length;

 

            if (SendARP((int)hostEntry.AddressList[0].Address, 0, macAddr, ref macAddrLen) != 0)

                return null;

 

            StringBuilder macAddressString = new StringBuilder();

            for (int i = 0; i < macAddr.Length; i++)

            {

                if (macAddressString.Length > 0)

                    macAddressString.Append(":");

                macAddressString.AppendFormat("{0:x2}", macAddr[i]);

            }

            return macAddressString.ToString();

        }

 

        // *********************************************************************

        /// <summary>

        /// Checks to see if the host specified by

        /// <paramref name="hostNameOrAddress"/> is currently accessible.

        /// </summary>

        /// <param name="hostNameOrAddress">Host name or IP address of the

        /// remote host for which MAC address is desired.</param>

        /// <returns><see langword="true" /> if the host is currently accessible;

        /// <see langword="false"/> otherwise.</returns>

        private static bool IsHostAccessible(string hostNameOrAddress)

        {

            Ping ping = new Ping();

            PingReply reply = ping.Send(hostNameOrAddress, PING_TIMEOUT);

            return reply.Status == IPStatus.Success;

        }

    }

 

 

타 프로세스에 메세지를 전송하는 방법은 여러가지가 있겠지만,

 

2개의 Winform 프로그램에서 SendMessage 함수를 이용해 타 프로세스에 문자열 메세지를 전송하는 방법을 포스팅하겠습니다.

 

 

 

WM_COPYDATA 메세지를 이용하겠습니다. 예제를 위한 코드이니 코드 중복은 이해해주세요^^;

 

메세지를 수신할 Winform에서는 WndProc(윈도우 프로시져) 메서드를 오버라이드합니다.

 

 

 

 

 

 const int WM_COPYDATA = 0x4A;

 

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

 

        protected override void WndProc(ref Message m)

        {

            try

            {

                switch (m.Msg)

                {

                    case WM_COPYDATA:

                        COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));

                        MessageBox.Show(cds.lpData);

                        break;

                    default:

                        base.WndProc(ref m);

                        break;

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

 

 

 

 

메세지를 전송할 Winform에서는 SendMessage 함수를 이용해 메세지를 송신합니다.

 

 

 

 

const int WM_COPYDATA = 0x4A;

  

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, ref COPYDATASTRUCT lParam);

 

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

 

        private void OnButtonSendClick(object sender, EventArgs e)

        {

            string msg = this.tbMsg.Text.Trim();

 

            if (string.IsNullOrEmpty(msg))

            {

                MessageBox.Show("메세지를 입력해주세요");

                return;

            }

 

           Process []pro  =  Process.GetProcessesByName("HowToPostMessage");

           if(pro.Length > 0)

            {

                byte[] buff = System.Text.Encoding.Default.GetBytes(msg);

 

                COPYDATASTRUCT cds = new COPYDATASTRUCT();

                cds.dwData = IntPtr.Zero;

                cds.cbData = buff.Length+1;

                cds.lpData = msg;

 

                SendMessage(pro[0].MainWindowHandle, WM_COPYDATA, 0, ref cds);

            }

        }

 

 

 

 

프로젝트 압축 파일입니다.

 

 

HowToPostMessage.zip

 

Xaml에서 특수문자를 쓸때에는 아래의 표를 참고하면 되겠습니다.

 

 

 <

&lt;

 >

 &gt;

 &

 &amp;

 "  &quot;

 

 

아래와 같이 사용 하실 수 있습니다.

 

 

 

  <TextBlock Text="&gt;"/> 

 

 

왼쪽이 키보드, 오른쪽이 Keys 열거형 이름입니다.

~,` -> Oemtilde
!,1 -> D1
@,2 -> D2
...
),0 -> D0
_,- -> OemMinus
+,= -> OemPlus
|,\ -> OemPipe
← (BackSpace) -> Back
{,[ -> OemOpenBrackets
},] -> OemCloseBrackets
Enter -> Return
Caps Lock -> Capital
:,; -> OemSemicolon
",' -> OemQuotes
Shift -> ShiftKey (오른쪽 왼쪽 다 인식합니다. LShiftKey, RShiftKey도 있습니다.)
< ,, -> Oemcomma
> ,. -> OemPeriod
?,/ -> OemQuestion
Ctrl -> ControlKey (Shift와 마찬가지)
왼쪽 윈도우키 -> LWin
Alt -> Menu (Shift와 마찬가지)
한자 -> HanjaMode
SpaceBar -> Space
한/영 -> KanaMode
오른쪽 윈도우키 -> RWin
마우스 오른쪽 버튼 메뉴 기능의 키(오른쪽 윈도우키 옆에 있는 키) -> Apps
오른쪽 Ctrl -> HanjaMode (Ctrl, RControlKey로도 작동하고, HanjaMode로도 작동합니다.)
PageUp -> PageUp, Prior
PageDown -> PageDown, Next
↑ -> Up
← -> Left
↓ -> Down
→ -> Right

키패드 있는 곳의 키들
/ -> Divide
* -> Multiply
- -> Subtract
+ -> Add
0~9까지 키패드의 숫자들 -> NumPad0 ~ NumPad9
. -> Decimal

 

 

 

참조 : http://sjpison.tistory.com/10

 

 

 

 

 

기존 Style에 Style을 추가하려면 Style 클래스의 BaseOn 속성을 이용하면 됩니다.

 

아래의 코드와 같이 BasedOn 속성을 이용하시면 기존 Style을 기반으로 Style을 추가 및 수정 할 수 있습니다.

 

<Style x:Key="BaseImageButtonStyle" TargetType="{x:Type Button}">

 

<Style/>

 

 ...........

 

<Style x:Key="ExtendsImageButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseImageButtonStyle }">

 

<Style/> 

 

 

 

 

 

 

'.Net > WPF' 카테고리의 다른 글

[MVVM] CollectionViewSource Class를 이용해 정렬하기  (0) 2013.07.29
WPF Xaml에서 특수문자 사용  (0) 2013.07.11
WPF 윈도우 포커스(focus) 가지 않게 하기  (0) 2013.07.10
WPF WndProc  (0) 2013.07.10
Binding.UpdateSourceTrigger  (0) 2013.07.09

예를들어 가상키보드를 구현할 때 가상키보드에 포커스가 옮겨지면 안됩니다.

 

Win32의 SetWindowLong 함수를 사용하시면 포커스가 이동되지 않는 Window를 생성하실 수 있습니다.

 

 

 

private const int GWL_EXSTYLE = -20;

        private const int WS_EX_NOACTIVATE = 0x08000000;

 

        [DllImport("user32.dll")]

        public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

 

        [DllImport("user32.dll")]

        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

 

        protected override void OnSourceInitialized(EventArgs e)

        {

            base.OnSourceInitialized(e);

 

            WindowInteropHelper helper = new WindowInteropHelper(this);

            IntPtr ip = SetWindowLong(helper.Handle, GWL_EXSTYLE,

                GetWindowLong(helper.Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);

        } 

 

 

 

 

 

 

'.Net > WPF' 카테고리의 다른 글

WPF Xaml에서 특수문자 사용  (0) 2013.07.11
WPF 기존 Style에 Style 추가  (0) 2013.07.11
WPF WndProc  (0) 2013.07.10
Binding.UpdateSourceTrigger  (0) 2013.07.09
[MVVM Galasoft.MvvmLight.WPF4] EventToCommand, 이벤트 정보를 넘기자!  (0) 2013.07.05

Winform Form Class에서는 윈도우 프로시져를 오버라이드 할 수 있게 제공해주지만

 

WPF Window Class에는 제공해주지 않고 있습니다.

 

아래의 코드와 같이 하시면 윈도우 프로시져를 확인 하실 수 있습니다.

 

 

 

        [DllImport("user32.dll")]

        static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);

        private const int WM_DRAWCLIPBOARD = 0x308;

        private const int WM_CHANGECBCHAIN = 0x30D;

 

        void OnLoaded(object sender, RoutedEventArgs e)

        {           

            HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);

            source.AddHook(new HwndSourceHook(WndProc));

 

 

            IntPtr mNextClipBoardViewerHWnd = SetClipboardViewer(new System.Windows.Interop.WindowInteropHelper(this).Handle);

        }

 

 

 

 

 

 

 

Binding 클래스의 UpdateSourceTrigger 속성은 바인딩 소스 업데이트 타이밍을 결정하는 값을 가져오거나 설정할때 사용되는 속성입니다.

 

Xaml에서는 아래와 같이 사용합니다.

 

 

 Text="{Binding Description,UpdateSourceTrigger=PropertyChanged}" 

 

 

 

UpdateSourceTrigger의 열거형식은 아래와 같습니다.

 

멤버 이름 

 설명

 Default

 바인딩 대상 속성의 기본 UpdateSourceTrigger 값입니다. Text속성의 기본값은 LostFocus이지만, 대부분의 종속성 속성의 기본값은 PropertyChanged입니다.

종속성 속성의 기본 UpdateSourceTrigger 값을 확인하는 프로그래밍 방식은 GetMetadata를 사용하여 속성의 속성 메타데이터를 가져온 다음 DefaultUpdateSourceTrigger 속성의 값을 확인하는 것입니다.

 PropertyChanged

 바인딩 대상 속성이 변경될 때마다 바인딩 소스를 즉시 업데이트합니다.

 LostFocus

 바인딩 대상 요소가 포커스를 잃을 때마다 바인딩 소스를 업데이트합니다.

 Explicit

 UpdateSource 메서드를 호출할 때만 바인딩 소스를 업데이트합니다.

예를 들들면 아래와 같은 코드입니다.


 BindingExpression be = textBox1.GetBindingExpression(TextBox.TextProperty);
 be.UpdateSource();

 

 

 [참조 : MSDN]

 

 

 

 시나리오 마다 다르겠지만, 대부분의 컨트롤을 사용할때에는 Default 값을 사용하면 문제가 보통 없습니다만 TextBox의 Text 속성에 바인딩할 때,

 

포커스를 잃을 때만 소스가 업데이트 되기 때문에 문제가 발생합니다.

 

 예를들어 TextBox에 사용자가 문자열을 입력한 후, 수정 버튼을 클릭하는 시나리오에서 수정 버튼은 Text 속성에 바인딩 되어 있는 소스의 값이 String.IsNullEmpty값이

 

true일때만 활성화시킨다면 문제가 발생합니다.

 

 위의 표의 설명과 같이 Text의 Default 값은 LostFocus(포커스를 잃을 때)이기 때문입니다.

 

 TextBox Text 속성에 바인딩 할때에 PropertyChanged 속성을 사용하면 문제가 해결합니다. 

 

 

단 MSDN에서는 이렇게 얘기합니다.

 

 키 입력이 있을 때마다 업데이트하면 성능이 떨어지고, 일반적으로 사용자가 새 값을 커밋하기 전에 입력 오류를 수정하고 백스페이스 키를 누를 수 있는 기회가 없어집니다.

[참조 : MSDN - Binding.UpdateSourceTrigger]

 

 

 

 

 

 

 

 View에서 특정 이벤트가 발생할 때 특정 동작을 하고싶을때에는 System.Windows.Interactivity 네임스페이스의 Interaction Class를 이용하여 ICommand 개체에 바인딩하였습니다.

 만약 특정 컨트롤에서 MouseDown 이벤트가 발생할때 이벤트 매개변수인 MouseButtonEventArgs 개체를 넘겨주고 싶다면 Galasoft의 EventToCommand Class를 이용하여 쉽게 구현 할 수 있습니다.

 

 

 Galasoft.MvvmLight.WPF4 툴킷이 있다는 가정하에 설명하겠습니다.

 우선 View의 xaml 코드에서 두개의 네임스페이스를 등록합니다.

 

 

       xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

       xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4" 

 

 

 

 

 저는 테스트를 위해 Window가 Loaded 되었을 때와 MouseDown 되었을 때 ICommand 개체를 바인딩하였습니다.

 MouseDown 이벤트가 발생하였을 때에는 MouseButtonEventArgs 이벤트를 매개변수로 넘기기 위해 PassEventArgsToCommand 속성을 True로 하였습니다. 이때에는 ICommand 매개변수가 꼭 MouseButtonEventArgs여야만 합니다.

 

 

   <i:Interaction.Triggers>

        <i:EventTrigger EventName="Loaded">

            <i:InvokeCommandAction Command="{Binding CmdLoaded, Mode=OneWay}" CommandParameter="Loaded!"/>

        </i:EventTrigger>

        <i:EventTrigger EventName="MouseDown">

            <cmd:EventToCommand Command="{Binding CmdMouseDown, Mode=OneWay}" MustToggleIsEnabledValue="True"  PassEventArgsToCommand="True"/>

        </i:EventTrigger>

    </i:Interaction.Triggers>

 

 

 

 

 ViewModel 코드입니다. 두개의 커맨드 모두 메세지 박스로 데이터를 보여주고 있습니다.

 

 

       private RelayCommand<string> _cmdLoaded;

 

        public RelayCommand<string> CmdLoaded

        {

            get

            {

                if (_cmdLoaded == null)

                    _cmdLoaded = new RelayCommand<string>(a =>

                        MessageBox.Show(a));

                return _cmdLoaded;

            }

        }

 

        private RelayCommand<MouseButtonEventArgs> _cmdMouseDown;

 

        public RelayCommand<MouseButtonEventArgs> CmdMouseDown

        {

            get

            {

                if (_cmdMouseDown == null)

                    _cmdMouseDown = new RelayCommand<MouseButtonEventArgs>(a =>

                        MessageBox.Show(a.MouseDevice.GetPosition(a.OriginalSource as IInputElement).ToString()));

                return _cmdMouseDown;

            }

        }

 

 

 

 프로젝트 첨부하였습니다.

 

AboutEventToCommand.zip

 

 

 

 

 

Transform은 컨트롤의 실제 속성은 그대로 둔채 모양만 변형해주는 기능이다.

 

RenderTransform과 LayoutTransform의 차이는 Transform 되는 시점이다. 아래의 표는 어느 시점에 Transform되는지 나타내고 있다.

 

 LayoutTransform

  • Measure
  • Arrange
  •  

     RenderTransform

  • Render
  •  

     

     

    Button의 위치를 이동, 크기, 회전 등등의 일을 굉장히 쉽게 할 수 있다. Transform을 이용해 크기를 변경하여도 실제 버튼의 크기는 변경되지 않는다.

     

     

     TranslateTransform 

     2차원 x-y 좌표계에서 개체를 변환(이동)합니다.

     RotateTransform

     2차원 x-y 좌표계에서 지정한 점을 기준으로 개체를 시계 방향으로 회전합니다.

     ScaleTransform

     개체의 크기를 조정에서 2차원 x-y 좌표계입니다.

     SkewTransform 

     개체에 적용되는 2차원 기울이기를 나타냅니다.

     MatrixTransform

     2-D 평면에서 개체 또는 좌표계를 조작하는 데 사용되는 임의의 행렬 유사 변환을 만듭니다. 
             

     

     

     

    4가지 Transform이 어떤 기능을 하는지 체험하기 위해 테스트 프로그램을 작성하였다.

    전체소스와 프로젝트 압축파일을 함께 올린다.

     

     

    [간단한 Transform 예제]

     

     

     

     

    <Window x:Class="AboutRenderTransform.MainWindow"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            Title="MainWindow" Height="350" Width="673">

        <Grid>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="254*" />

                <ColumnDefinition Width="400" />

            </Grid.ColumnDefinitions>

            <Canvas>

                <Button FontSize="20" Content="버튼" x:Name="btnTest" Canvas.Left="103" Canvas.Top="134">

                <Button.RenderTransform>

                    <TransformGroup>

                        <TranslateTransform x:Name="translateBtn"/>

                        <RotateTransform x:Name="rotateBtn"/>

                        <ScaleTransform x:Name="scaleBtn"/>

                        <SkewTransform x:Name="skewBtn"/>

                    </TransformGroup>

                </Button.RenderTransform>

            </Button>

            </Canvas>

            <Grid Grid.Column="1" Margin="2,0,0,0" ShowGridLines="True" >

                <Grid.RowDefinitions>

                    <RowDefinition Height="61*" />

                    <RowDefinition Height="61*" />

                    <RowDefinition Height="60*" />

                    <RowDefinition Height="129*" />

                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>

                    <ColumnDefinition Width="141" />

                    <ColumnDefinition Width="165*" />

                </Grid.ColumnDefinitions>

                <Label Content="TranslateTransform" HorizontalAlignment="Center"  VerticalAlignment="Center" HorizontalContentAlignment="Center" Height="59" Width="141" VerticalContentAlignment="Center" />

                <Label Content="X : " Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="19,17,0,0" VerticalAlignment="Top" />

                <Label Content="Y : " Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="79,17,0,0" VerticalAlignment="Top" />

                <TextBox Text="{Binding ElementName=translateBtn, Path=X}" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="46,19,0,0" Name="textBox1" VerticalAlignment="Top" Width="28" AcceptsTab="False" AcceptsReturn="False" VerticalScrollBarVisibility="Disabled" />

                <TextBox Text="{Binding ElementName=translateBtn, Path=Y}" Height="23" HorizontalAlignment="Left" Margin="105,19,0,0" VerticalAlignment="Top" Width="28" Grid.Column="1" />

                <Label Content="RotateTransform" Height="59" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" Width="141" Grid.Row="1" />

                <Label Content="RenderTransformOrigin" Grid.Row="1" Height="27" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="1" Width="145" Margin="0,1,0,0" />

                <Label Content="X : " Height="28" HorizontalAlignment="Left" Margin="133,1,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.Row="1" />

                <Label Content="Y : " Height="28" HorizontalAlignment="Left" Margin="188,1,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.Row="1" />

                <TextBox Text="{Binding ElementName=rotateBtn, Path=CenterX}" Height="23" HorizontalAlignment="Left" Margin="156,3,0,0" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="1" />

                <TextBox Text="{Binding ElementName=rotateBtn, Path=CenterY}" Height="23" HorizontalAlignment="Left" Margin="212,3,0,0" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="1" />

                <Label Content="Angle :" Height="27" HorizontalAlignment="Left" Margin="1,31,0,0" VerticalAlignment="Top" Width="48" Grid.Column="1" Grid.Row="1" />

                <TextBox Text="{Binding ElementName=rotateBtn, Path=Angle}" Height="23" HorizontalAlignment="Right" Margin="0,34,174,0" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="1" />

                <Label Content="ScaleTransform" Height="59" HorizontalAlignment="Center" HorizontalContentAlignment="Center" Margin="0,60,0,1" VerticalAlignment="Center" VerticalContentAlignment="Center" Width="141" Grid.Row="1" Grid.RowSpan="2" />

                <Label Content="ScaleX : " Height="28" HorizontalAlignment="Left" Margin="1,1,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.Row="2" />

                <Label Content="ScaleY : " Height="28" HorizontalAlignment="Left" Margin="1,32,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.Row="2" />

                <TextBox Text="{Binding ElementName=scaleBtn, Path=ScaleX}" Height="23" HorizontalAlignment="Left" Margin="52,2,0,0" Name="textBox6" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="2" />

                <TextBox Text="{Binding ElementName=scaleBtn, Path=ScaleY}" Height="23" HorizontalAlignment="Left" Margin="52,33,0,0" Name="textBox7" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="2" />

                <Label Content="SkewTransform" Height="59" HorizontalAlignment="Center" HorizontalContentAlignment="Center" Margin="0,0,0,70" VerticalAlignment="Center" VerticalContentAlignment="Center" Width="141" Grid.Row="3" />

                <Label Content="RenderTransformOrigin" Height="27" HorizontalAlignment="Left" Margin="1,0,0,0" VerticalAlignment="Top" Width="145" Grid.Column="1" Grid.Row="3" />

                <Label Content="X : " Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="134,0,0,0" VerticalAlignment="Top" Grid.Row="3" />

                <Label Content="Y : " Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="189,0,0,0" VerticalAlignment="Top" Grid.Row="3" />

                <TextBox Text="{Binding ElementName=skewBtn, Path=CenterX}" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="157,2,0,0" Name="textBox8" VerticalAlignment="Top" Width="28" Grid.Row="3" />

                <TextBox Text="{Binding ElementName=skewBtn, Path=CenterY}" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="213,2,0,0" Name="textBox9" VerticalAlignment="Top" Width="28" Grid.Row="3" />

                <Label Content="AngleX : " Height="28" HorizontalAlignment="Left" Margin="1,29,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.Row="3" />

                <Label Content="AngleY : " Height="28" HorizontalAlignment="Left" Margin="1,60,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.Row="3" />

                <TextBox Text="{Binding ElementName=skewBtn, Path=AngleX}" Height="23" HorizontalAlignment="Left" Margin="52,30,0,0" Name="textBox10" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="3" />

                <TextBox Text="{Binding ElementName=skewBtn, Path=AngleY}" Height="23" HorizontalAlignment="Left" Margin="52,61,0,0" Name="textBox11" VerticalAlignment="Top" Width="28" Grid.Column="1" Grid.Row="3" />

            </Grid>

        </Grid>

    </Window>

     

     

     

    [MainWindow.xaml 소스]

     

     

     

     

    AboutRenderTransform.zip

     

    + Recent posts