2014-12-25 210 views
2

在C++中使用secondaryTitle時,必須輸入指向徽標的URI。如果我嘗試將它指向應用程序包外的任何文件,則URI將失敗。我試圖讓用戶使用filepicker選擇文件將文件路徑轉換爲URI

void App3::MainPage::FindLogo(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    FileOpenPicker^ openPicker = ref new FileOpenPicker(); 
    openPicker->ViewMode = PickerViewMode::Thumbnail; 
    openPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary; 
    openPicker->FileTypeFilter->Append(".jpg"); 
    openPicker->FileTypeFilter->Append(".jpeg"); 
    openPicker->FileTypeFilter->Append(".png"); 

    create_task(openPicker->PickSingleFileAsync()).then([this](Windows::Storage::StorageFile^ file) 
    { 
     if (file) 
     { 
      StorageFolder^ folder; 
      auto ur = ref new Uri("ms-appx:///Assets//"); 

      String^ s = Windows::ApplicationModel::Package::Current->InstalledLocation->Path; 


      create_task(StorageFolder::GetFolderFromPathAsync(s)).then([=](StorageFolder^ folder){ 
       create_task(file->CopyAsync(folder, file->Name, NameCollisionOption::ReplaceExisting)).then([this, file](task<StorageFile^> task) 
       { 

        logoFile = ref new Uri("ms-appdata:///local//App3//Assets//StoreLogo.scale-100.png"); 
       }); 
      }); 
     } 
    }); 
} 

然後複製該文件並將其保存在應用程序目錄中。使用uri指向新副本時仍然失敗。

void App3::MainPage::kk(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    text = url->Text->ToString(); 
    ids = id->Text->ToString(); 
    auto test = ref new Windows::UI::StartScreen::SecondaryTile(ids, "hi", text, logoFile, Windows::UI::StartScreen::TileSize::Square150x150); // Breaks right here 

//錯誤:logofile是0x05fcc1d0

num++; 

    test->RequestCreateAsync(); 



    //auto uri = ref new Windows::Foundation::Uri("http://www.google.com"); 
    //concurrency::task<bool> launchUriOperation(Windows::System::Launcher::LaunchUriAsync(uri)); 
} 

修訂

create_task(openPicker->PickSingleFileAsync()).then([this](Windows::Storage::StorageFile^ file) 
    { 
     if (file) 
     { 
      StorageFolder^ folder = ApplicationData::Current->LocalFolder; 
       create_task(file->CopyAsync(folder, file->Name, NameCollisionOption::ReplaceExisting)).then([this, file](task<StorageFile^> task) 
       { 
        String^ path = "ms-appdata:///local/" + file->Name; 
        logoFile = ref new Uri(path); 
       }); 

     } 
    }); 

回答

3

你試圖拾取的文件複製到應用程序包的位置(InstalledLocation),而比進入應用程序數據文件夾。包位置是隻讀的,所以CopyAsync應該失敗。使用StorageFolder^localFolder = ApplicationData :: Current-> LocalFolder;代替。

另外,您確實需要ms/appdata:/// local中的///,因爲這是省略包id的簡寫形式,但您只需要URI中的其他位置。

最後,請注意,平鋪圖片必須是200KB或更小,並且必須是1024x1024或更小,否則它們將不會出現。如果您使用照片圖像,請使用JPEG壓縮;矢量圖像壓縮與PNG最好。有關處理此問題的更多信息,請參閱我的免費電子書第16章Programming Windows Store Apps with HTML, CSS, and JavaScript, 2nd Edition,特別是從第887頁開始的「基本磁貼更新」和第899頁的側邊欄。內容適用於以所有語言編寫的應用程序,並且它是免費的書所以沒有風險。

+0

我剛試過,它仍然找不到它。我用更新後的代碼更新了我的帖子。謝謝。 – user41616

+0

這很可能是文件太大或圖片尺寸太大......請參閱我編輯的回覆。您可以通過查看本地appdata文件夾並查看在那裏複製的內容來驗證圖像。如果它在任何維度上都超過200K或1024像素,該圖塊將不會顯示它。 –