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%」ボタンに設定したいと思います

よろしくお願いします、ジャック

4

2 に答える 2

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 で質問にあるようなコードを書くべきではありません。データ バインディングの使用方法を学習します。とてもパワフルです。IsEnabled代わりに、ボタンのプロパティを公開されたプロパティにバインドするだけです。

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 に答える
0

それは正しいやり方ではありません。私が正しく理解していれば、ボタンの上に画像を重ねて、ユーザーがボタンを使用できないようにする必要があります。うまくいきません。

そのためには、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 に設定します。

  <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 に答える