2012-05-26 3 views
0

단추에 맞게 코드를 통해 이미지 위치를 설정하고 싶습니다 (스크린 샷 참조). 그러나 나는 그것을 해결할 수 없다. WinForms에서는 쉽지만 Silverlight에서는 X & Y를 설정할 수 없습니다.코드를 통해 이미지 위치 설정

public void LockControls() 
    { 
     int LockIndex = 0; 

     DependencyObject myUserControl = LayoutRoot; 
     foreach (var button in FindAll<Button>(myUserControl)) 
     { 
      if (button.Tag != null) 
      { 
       Image LockedIcon = new Image(); 

       LockedIcon.Width = 20; 
       LockedIcon.Height = 20; 
       //LockedIcon.Margin = new Thickness(0,0,0,0); 


       LockedIcon.Source = new BitmapImage(new Uri("images/LockedIconx20alpha.png", UriKind.Relative)); 
       LockedIcon.Name = "Lockie" + LockIndex; 

       LayoutRoot.Children.Add(LockedIcon); 
       button.Tag = "Locked" + LockIndex; 
       LockIndex++; 

      } 
     } 

    } 

http://puu.sh/wS7g 스크린 샷 이미지의 위치 (locck)를 보여줍니다,하지만 난 현재 위치가 설정되는 방법을 이해하지 않습니다. 그냥 당신이 임의의 이미지 위치를 설정하려는 경우, 당신은 이미지 컨트롤을 호스팅해야한다은 "0 %"버튼에 미리

감사합니다, 잭

일반적으로

답변

0

을 위치를 설정하려면, 명확하게 캔버스 컨테이너에.

그러나 실제로는 잠금 표시 여부에 따라 Button의 Content 요소를 변경해야합니다.

<UserControl DataContext="{Binding Main, Source={StaticResource Locator}} 

     <Grid.Resources> 
      <converters:VisibilityConverter x:Key="VisibilityConverter" /> 
     </Grid.Resources> 

     <Button Width="100" Height="23" IsEnabled="{Binding IsControlsEnabled}"> 
      <Button.Content> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="lock.png" Margin="10,0,10,0" 
          Visibility="{Binding IsControlsEnabled, Converter={StaticResource VisibilityConverter}}"/> 
        <TextBlock Text="Button"/> 
       </StackPanel> 
      </Button.Content> 
     </Button> 

또한 Silverlight에서 질문에 사용하는 코드를 작성하면 안됩니다. 데이터 바인딩을 사용하는 방법을 배웁니다. 그것은 매우 강력합니다. 대신 버튼의 IsEnabled 속성을 노출 속성에 바인딩하면됩니다.

그렇게하고있는 MVVM 라이트 툴킷 (난 당신이 실버 라이트/WPF 개발을위한 MVVM 패턴을 배울 것을 권장) 사용하는 예 : 보기 모델 :

public class MainViewModel : ViewModelBase 
{ 

    private bool isControlsEnabled; 
    public bool IsControlsEnabled 
    { 
    get { return isControlsEnabled; } 
    set 
    { 
     if (IsControlsEnabled.Equals(value)) return; 
     isControlsEnabled = value; 
     RaisePropertyChanged(() => IsControlsEnabled); 
    } 
    } 
} 

가시성 변환기 :

public class VisibilityConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (bool)value ? Visibility.Collapsed : Visibility.Visible; 
    } 

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

그런 다음 바운드 컨트롤 (예 : CheckBox)을 사용 설정/해제 할 수 있습니다.

+0

지금까지의 위치가 창 중앙에 있음을 알았습니다. 하지만 런타임에 이미지가 생성되므로 XAML을 통하지 않고 코드를 통해 위치를 설정하려고합니다. –

+0

음, 사용하는 방법이 열등하다고 생각합니다. 수동으로 컨트롤을 반복하고, 위치를 찾으며, 수동으로 레이아웃을 이미지에 추가하고 페이지에 배치하는 것은 매우 비효율적입니다. Silverlight에서 데이터 바인딩을 사용하는 방법을 익히십시오. 매우 강력하고 질문에 대한 방법과 같은 코드를 작성할 필요가 없습니다. –

+0

코드 예제가 있습니까? –

0

올바른 방법이 아닙니다. 내가 올바르게 이해한다면 사용자가 버튼을 사용하지 못하도록 단추 위에 이미지를 슈퍼 임 포즈해야합니다. 그것은 작동하지 않습니다.

이를 위해서는 layout system of Silverlight을 이해해야합니다. 측정 및 정렬 이벤트 중에 컨트롤이 엔진에 의해 배치됩니다. 그런 이미지를 오버레이하려고하면 해당 이벤트에 연결하거나 Button 클래스를 파생시키고 이미지를 오버레이하기 위해 Arrange 메서드를 재정의해야합니다.

하지만 버튼 자체가 비활성화되어 있지 않기 때문에 사용자가 버튼을 사용하는 것을 막을 수는 없으며 그 버튼에 "탭"하여 활성화 할 수 있습니다.

대신 버튼의 스타일을 사용하고 잠긴 이미지를 오버레이하려면 사용 안함 상태를 재정의하는 것이 좋습니다.

<Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3" Fill="#FFFFFFFF" Opacity="0" IsHitTestVisible="false" /> 

<Image x:Name="DisabledVisualElement" IsHitTestVisible="false" Opacity="0" Width="20" Height="20" Source="images/LockedIconx20alpha.png" /> 

에 의해 그리고 다음 1로에 불투명도를 설정 : The button style is described here. 당신이해야 할 모든 대체됩니다

<vsm:VisualState x:Name="Disabled"> 
     <Storyboard> 
      <DoubleAnimation Duration="0" Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="Opacity" To=".55"/> 
     </Storyboard> 
    </vsm:VisualState> 

이 버튼이 스타일을 설정합니다 (I 이 작업을 수행하는 방법을 알고 있다고 가정 할 때) 버튼을 잠글 필요가있을 때 버튼을 사용 안 함으로 설정하면 이미지가 자동으로 위에 놓이게되고 단추는 클릭 할 수 없게됩니다.