2017-01-11 7 views
0

を交換してください:私は、XAMLでのコードスニペット以下のいる動的ボタンでのBitmapImage(XAML)

<UserControl x:Class="Ournamespace.OurClassName" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    ... 
      d:DesignHeight="250" d:DesignWidth="774" Loaded="UserControl_Loaded"> 

.... 
<Button Grid.Column="0" x:Name="Button_NewMarker" Style="{StaticResource ViewpointFlatButtonStyle}" Width="90" Height="65" 
    VerticalAlignment="Top" Click="Button_NewMarker_Click" x:FieldModifier="public" Margin="0,0,0,0" Grid.Row="1"> 
    <BitmapImage UriSource="Icons/markers_add_disabled.png" /> 
</Button> 

を、私は

if(!imgCache.ContainsKey(path)) 
{ 
    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.UriSource = new Uri(path, UriKind.Relative); 
    bi.DownloadFailed += bi_DownloadFailed; 
    bi.DecodeFailed += bi_DecodeFailed; 
    bi.EndInit(); 
    imgCache[path] = bi; 

} 
Button_NewMarker.BeginInit(); 
Button_NewMarker.Content = imgCache[path]; 
//Button_NewMarker.Content = oldbmp; 
Button_NewMarker.EndInit(); 

新しいイメージがされてロードすることで、動的にボタン上の画像を交換しようとしていますエラーは発生しません(このためにオーバーライドされたイベント) とBitmapImageが置き換えられているようですが、何らかの理由で灰色です。 イメージはリソースとしてプロジェクトに追加され、最初に読み込まれたイメージは機能しているように見えますが、動的には置き換えられません。

<Image ... >とさらには<Image ... <ImageBitmapを使用しようとしましたが、それらのすべてが機能していません.UpControlとは何かが関係していると思われます。

私はインターネットで見たことが何ですか?どのようにすればよいかについての莫大な量の提案があります - これは絶対最小限のコードで行いたい - できればバインディングとテンプレートを使わないでください。バインディングは、すべてが手作業で行われた後の第2ステップとして提案することができます。

+0

:キーとしてファイル名を使用して

var bi = new BitmapImage(new Uri("pack://application:,,,/Images/Test.png")); 

、abobeは、おそらくのようになります。 ViewModelからバインドしますか? – Sasha

+0

回答を回答として投稿できますか? コンセプトを理解するために、バインドせずに最初に変更することをお勧めします。 データ複製の高度なメカニズムとしてのバインディングは、必要に応じて実行できます。 – TarmoPikaro

+0

ここを見てくださいhttp://stackoverflow.com/questions/20586/image-urisource-and-data-binding/862583#862583 – Sasha

答えて

1

イメージファイルがリソースファイル(つまり、Build ActionResourceに設定されているプロジェクトファイル)として管理されている場合は、Resource File Pack URIでロードする必要があります。画像ファイルTest.pngでプロジェクトフォルダImagesを想定し

:たぶん、あなたが試みることができる

var path = "Test.png"; 
var uri = "pack://application:,,,/Images/" + path; 

imgCache[path] = new BitmapImage(new Uri(uri)); 
+0

私はすでによく似た手法を使っています。新しいUri(path、UriKind。相対); - 絶対URLを使用している場合に限って両方のアプローチはうまく動作し、結果が同じになると、あるメソッドを別のメソッドに置き換えるのはなぜですか? – TarmoPikaro

+0

'新しいUri(path、UriKind.Relative)'は、異なったもの、すなわちローカルファイルへの相対URIです。 Pack URIは、アセンブリにコンパイルされたリソースファイルにアクセスします。 "どちらのアプローチもうまくいきます"と言えば、あなたの質問は何ですか? – Clemens

+0

デバッガからは次のように表示されます:imgCache [path]は '' * {Icons/markers_add_disabled.png} ''として表示されますが、この行が実行された後 ButtonLayoutMessage.Content = imgCache [ '{pack:// application:,,,/VdcUi; component/Icons/markers_add_disabled.png}' パスがどのように解決されているのかわかりませんが、正しく解決されたと思われます。また、bi_DownloadFailedとbi_DecodeFailedは呼び出されません。 – TarmoPikaro

関連する問題