通过代码设置图像位置

时间:2012-05-26 12:24:55

标签: c# silverlight image

我想通过代码设置图像位置以适应按钮(参见屏幕截图)。但我无法解决这个问题。在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%”按钮

提前致谢, 千斤顶

2 个答案:

答案 0 :(得分:0)

通常,如果要将Image位置设置为任意,则应将Image控件托管在Canvas容器中。

但是,在您的情况下,您应该根据是否需要显示锁定来更改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中真正编写问题中的代码。了解如何使用数据绑定。它非常强大。只需将Buttons的IsEnabled属性绑定到公开的Property即可。

使用MVVM Light工具包执行此操作的示例(我建议您学习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:

<CheckBox IsChecked="{Binding IsControlsEnabled, Mode=TwoWay}" Content="Controls are enabled"/>

答案 1 :(得分: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>

在您的按钮上设置此样式(我假设您知道如何执行此操作)然后当您需要锁定按钮时,将其设置为禁用,您的图像将自动放在顶部,您的按钮将无法点击