WPF image resources

Pochodzę głównie z sieci i trochę Windows tworzy tło. W przypadku nowego projektu będziemy używać WPF. Aplikacja WPF będzie potrzebowała 10-20 małych ikon i obrazów do celów ilustracyjnych. Myślę o przechowywaniu ich w assembly jako zasobów wbudowanych. Czy to dobra droga?

Jak określić w XAML, że kontrola obrazu powinna załadować obraz z osadzonego zasobu?

Author: Peter Mortensen, 2008-12-07

10 answers

Jeśli obraz będzie używany w wielu miejscach, to warto wczytać dane obrazu tylko raz do pamięci, a następnie udostępnić je między wszystkimi elementami Image.

Aby to zrobić, stwórz BitmapSource jako zasób gdzieś:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

Następnie w kodzie użyj czegoś w stylu:

<Image Source="{StaticResource MyImageSource}" />

W moim przypadku stwierdziłem, że musiałem ustawić Image.png Plik tak, aby miał akcję budowania Resource, a nie tylko Content. Powoduje to, że obraz jest przenoszony w skompilowanym zestawie.

 435
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 11:12:37

Uznałem za najlepszą praktykę używania obrazów, filmów itp. jest:

  • Zmień swoje pliki "Build action" na "Content". Upewnij się, że sprawdzisz Copy to build directory.
    • znajduje się w menu "kliknij prawym przyciskiem myszy" w oknie Eksploratora rozwiązań.
  • źródło obrazu w następującej format:
    • "/"YourAssemblyName"; component / "YourPath" / " YourImage.png""

Przykład

<Image Source="/WPFApplication;component/Images/Start.png" />

Korzyści:

  • pliki nie są osadzone w złożeniu.
    • Menedżer zasobów spowoduje problemy z przepełnieniem pamięci przy zbyt wielu zasobach (w czasie budowania).
  • może być wywoływany pomiędzy złożeniami.
 155
Author: Nuno Rodrigues,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 11:50:54

Niektórzy ludzie pytają o zrobienie tego w kodzie i nie otrzymują odpowiedzi.

Po wielu godzinach poszukiwań znalazłem bardzo prostą metodę, nie znalazłem żadnego przykładu, więc podzielę się tutaj swoją który działa z obrazami. (mój był a .gif)

Podsumowanie:

Zwraca ramkę Bitmapową, którą "miejsca docelowe" ImageSource wydają się lubić.

Użycie:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

Metoda:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

Nauka:

Z moich doświadczeń wynika, że sznur paczki nie jest problemem, Sprawdź swoje strumieni, a zwłaszcza jeśli odczytanie go po raz pierwszy ustawiło wskaźnik do końca pliku i musisz ponownie ustawić go na zero przed ponownym odczytaniem.

Mam nadzieję, że zaoszczędzi ci to wiele godzin, których chciałbym, aby ten kawałek miał dla mnie!

 43
Author: Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-13 19:13:10

W kodzie do załadowania zasobu w wykonywanym złożeniu, gdzie mój obraz Freq.png znajdował się w folderze Icons i zdefiniowany jako Resource:

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

Zrobiłem też funkcję:

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (assembly == null)
    {
        assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

Użycie (założenie, że umieścisz funkcję w klasie ResourceHelper):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

Uwaga : Zobacz MSDN Pack Uri w WPF:
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

 37
Author: Eric Ouellet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 12:13:45

Tak, to właściwa droga.

Możesz użyć obrazu w pliku zasobu, używając tylko ścieżki:

<Image Source="..\Media\Image.png" />

Musisz ustawić akcję budowania pliku obrazu na "zasób".

 36
Author: ema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 10:54:00

Pełny opis jak korzystać z zasobów: pliki zasobów, zawartości i danych aplikacji WPF

I jak się do nich odwoływać, przeczytaj "Pack URI in WPF".

W skrócie, istnieją nawet sposoby odwoływania się do zasobów z odwołanych / odwołujących się zespołów.

 13
Author: techfan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 12:11:46
  1. Visual Studio 2010 Professional SP1.
  2. . NET Framework 4 profil klienta.
  3. obraz PNG dodany jako zasób we właściwościach projektu.
  4. nowy plik w folderze Resources tworzony automatycznie.
  5. Build action set to resource.

To mi pomogło:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
 4
Author: JoanComasFdz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 09:16:51

Jeśli używasz Blend, aby było to wyjątkowo proste i nie mieć problemów z uzyskaniem prawidłowej ścieżki dla atrybutu Source, po prostu przeciągnij i upuść obraz z panelu projekt na projektanta.

 3
Author: user42467,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 11:48:59

Tak, to właściwa droga. Możesz użyć obrazów w pliku zasobu, używając ścieżki:

<StackPanel Orientation="Horizontal">
    <CheckBox  Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
    <Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>
 3
Author: Sanjay Ranavaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 12:15:03

Następująca praca i obrazy, które mają być ustawione to zasoby we właściwościach:

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;
 -3
Author: Raghulan Gowthaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 12:14:36