2012-05-26 154 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

在一般情況下,如果要設置圖像位置任意的,你應該主機的影像控制在Canvas容器中。

然而,在你的情況下,你應該真的改變你的按鈕的內容元素,取決於是否需要顯示鎖定。

<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中編寫你的問題的代碼。瞭解如何使用數據綁定。它非常強大。只需簡單地將Button的IsEnabled屬性綁定到公開的Property。

這樣使用MVVM光工具包(我建議你學習的Silverlight/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 IsChecked="{Binding IsControlsEnabled, Mode=TwoWay}" Content="Controls are enabled"/> 
+0

我發現它現在的位置是窗口的中心。但我想通過代碼設置位置而不是通過XAML,因爲圖像是在運行時生成的 –

+0

嗯,我認爲你使用的方法較差。手動迭代到控件,找到它們的位置,手動添加圖像佈局並將它們放置在頁面上效率非常低。瞭解如何在Silverlight中使用數據綁定。它非常強大,並且消除了編寫代碼的需要,就像您在問題中使用的方法一樣。 –

+0

你能給出一個代碼示例嗎? –

0

這不是正確的做法。如果我理解正確,您希望在按鈕之上加上一個圖像,以防止用戶使用它。它不會工作。

爲了您的理解,您必須瞭解layout system of Silverlight:在測量和排列事件期間,引擎會對控件進行佈局。 嘗試覆蓋這樣的圖像將要求您連接這些事件,或派生Button類並重寫Arrange方法以覆蓋圖像。

但是,這不會阻止用戶使用該按鈕,因爲按鈕本身沒有被禁用,並且可以只是「選項卡」並將其激活。

相反,我建議你使用按鈕樣式,並覆蓋,例如,禁用狀態覆蓋你的鎖定圖像。The button style is described here. 所有你需要做的就是更換:

<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:

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

設置你的按鈕,這個風格(我假設你知道如何做到這一點),那麼當你需要鎖定你的按鈕時,將其設置爲禁用,你的圖像將自動放置在頂部,而你的按鈕將不可點擊。