1

要するに:

私の目標は、コンテンツとして system.windows.controls.image (これからは画像) を持つことができる WPF/C#/XAML でボタン コントロールを作成することです。左上のピクセルを取得して、残りのコンテンツの背景は画像と同じ色です。画像の写真はプロジェクトのリソースです。今私の問題は、左上のピクセルを取得できないか、ボタンの画像を取得できないことです。グーグルで調べた後、いくつかの方法を試しました。

まず、画像を埋め込みリソースとして使用します。このようにして、画像の最初の 4 バイトを読み込むことで左上のピクセルを取得できますが、画像はボタンに表示されません。

2 番目: 写真をリソースとして使用します。このようにしてボタン上の画像を見ることができますが、画像にアクセスしようとすると、画像が存在しないというエラーメッセージでプログラムが壊れるため、ピクセルの色を取得できません。

詳細に:

app.xaml のボタン:

<Style TargetType="Button" BasedOn="{StaticResource GombAlap}" x:Key="GombM">
  <!-- BasedOn="{StaticResource {x:Type Button}}" -->
  <Setter Property="Width" Value="200" />
  <Setter Property="Margin" Value="0,0,10,0" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Grid>
          <Grid Background="{TemplateBinding Background}"  Opacity="0.2" />
          <DockPanel Margin="{TemplateBinding Padding}">
            <Grid Background="White" DockPanel.Dock="Bottom" Visibility="{TemplateBinding Tag, Converter={StaticResource StringEmptyVisibleVagyCollapse}}">
              <TextBlock Text="{TemplateBinding Tag}" />
            </Grid>
            <!-- kép -->
            <Viewbox Margin="{TemplateBinding Padding}">
              <ContentPresenter Margin="{TemplateBinding Padding}" />
            </Viewbox>
          </DockPanel>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

これは簡単なことです: テキストに button.tag を使用します (何も指定されていない場合は、その領域を非表示にします)。コンテンツは何でもかまいませんが、ボタンの残りの部分をカバーします。

私が使用しようとしているコード(コメントを翻訳していないことを申し訳ありません):

ÚjMenüpont("Exit to Windows", FStatic.ImageResourceből("../Gombok/Windows8.png"), delegate { Close(); }); //kilépés gomb

これはボタン初期化子を呼び出します。パラメータは、テキスト、画像、およびクリック ハンドラです。したがって、これは単にメインウィンドウを閉じます。最初に画像をロードするものを見てみましょう:

public static Image ImageResourceből(string Név)
{
  Image eredmény = new Image();
  BitmapImage bi = new BitmapImage(new Uri(Név, UriKind.RelativeOrAbsolute));
  eredmény.Source = bi;
  return eredmény;
}

これは実際に機能します..画像をロードし、それだけです。上記で呼び出した ÚjMenüpont コードを見てみましょう。

void ÚjMenüpont(string Név, object Tartalom, Action Feladat)
{
  Button új = new Button(); //új gomb
  új.Tag = Név; //ez lesz az alsó szöveg
  új.Content = Tartalom; //ez az objektum lesz a főrészen

  if (Tartalom is Image)
  {
    //ha tartalom kép, a színt a bal felső sarokhoz igazítom
    Image képként = Tartalom as Image; //képként értelmezem
    var balfelső = new byte[4]; //buffer

    Assembly futtató = Assembly.GetExecutingAssembly();
    System.Drawing.Image kép = System.Drawing.Bitmap.FromStream(futtató.GetManifestResourceStream(
      futtató.FullName.Substring(0, futtató.FullName.IndexOf(",")).Replace(" ", "_").Replace("../", string.Empty) + "." + képként.Source.ToString().Replace("../", string.Empty).Replace("/", ".")
    ));
    System.Drawing.Color szín = ((System.Drawing.Bitmap)(kép)).GetPixel(0, 0);
    új.Background = new SolidColorBrush(Color.FromRgb(szín.R, szín.G, szín.B));

    //új.Content = ZXF.Konvertálók.KonvertálImagera.Graphicsból(System.Drawing.Graphics.FromImage(kép));
  }

  új.Click += new RoutedEventHandler( //gombnyomáskor ez történik
    delegate(object sender, RoutedEventArgs args) //anoním eljárás click paramétereivel
    {
      //végrehajtom a feladatot
      Feladat(); //ami a paraméter
    }
  );
  Menü.Children.Add(új); //menüsávra teszem
}

最初にボタンを作成し、次にテキストをタグに渡します。コンテンツが画像かどうかを確認します。はいの場合、左上のピクセルを取得しようとします。今...

画像がリソースに埋め込まれている場合、プログラムは実行されますが、画像は表示されませんが (デザイナーからのみ、何らかの理由で)、ボタンの背景は完璧になります。

ここに画像の説明を入力

デザイナーからは、次のようになります。

ここに画像の説明を入力

しかし、(埋め込みリソースではなく) リソースとして使用しようとすると、そのようなリソースが利用できないため、中断されます。

ここに画像の説明を入力

左上隅を取得するために他の方法をチェックしましたが、コードを実行すると、存在しないというメッセージが表示されました-実行時、リソース...これまでのところ、これは私がまとめることができる最高の作業コードです.

質問は次のとおりです。

どうすれば画像も表示できますか、または左上のピクセルを取得するにはどうすればよいですか?

4

0 に答える 0