1

简而言之:

我的目标是在 WPF/C#/XAML 中制作一个按钮控件,它可以有一个 system.windows.controls.image (从现在开始:图像)作为内容,我想把它作为左上角的像素并制作其余的内容背景颜色与图像相同。图片的图片是项目的资源。现在我的问题是,我根本无法获得左上角的像素,或者我无法获得按钮上的图片。经过一番谷歌搜索后,我尝试了几种方法。

第一:我使用图片作为嵌入式资源。这样我可以通过加载图片的前 4 个字节来获取左上角的像素,但图片不会显示在按钮上。

第二:我使用图片作为资源。这样我可以看到按钮上的图像,但我无法获得像素颜色,因为当我尝试访问图片时,它会破坏程序并显示有关图片不存在的错误消息。

详细地:

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