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 屏幕截图显示了图像位置(锁定),但我不明白当前位置是如何设置的。澄清一下,我想将位置设置为“0%”按钮

在此先感谢,杰克

4

2 回答 2

0

这不是正确的做法。如果我理解正确,您想在按钮顶部叠加图像以防止用户使用它。它行不通。

为此,您必须了解Silverlight 的布局系统:控件在测量和安排事件期间由引擎布局。尝试像这样覆盖图像将需要您连接这些事件,或者派生 Button 类并覆盖 Arrange 方法以覆盖图像。

但这不会阻止用户使用该按钮,因为该按钮本身并没有被禁用,人们只需“Tab”进入它,然后激活它。

相反,我建议您使用按钮样式,并覆盖,例如,禁用状态以覆盖您的锁定图像。此处描述了按钮样式。 您所要做的就是替换:

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

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

于 2012-05-26T14:57:16.920 回答
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 中编写您的问题中的那种代码。了解如何使用数据绑定。它非常强大。只需将IsEnabledButton 的属性绑定到公开的属性即可。

使用 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"/>
于 2012-05-26T12:39:25.497 回答